diff --git a/.editorconfig b/.editorconfig index 1606d61f..c79c990f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -17,7 +17,7 @@ insert_final_newline = true charset = utf-8 indent_style = space indent_size = 4 -continuation_indent_size = 8 +continuation_indent_size = 4 [*.xml] continuation_indent_size = 4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6830fd49..dd463d04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,32 @@ Changelog ========== +Version 5.9.0 *(2021-02-16)* +---------------------------- + + * Added Search + * Added a White theme with special handling + * Some stability and translation improvements + +Version 5.8.3 *(2021-01-27)* +---------------------------- + + * Adding some stability and translation improvements + +Version 5.8.2 *(2021-01-18)* +---------------------------- + + * Fixed a glitch with inability to send messages in empty conversations + * Adding a settings item for quickly getting into notification settings + * Some stability and translation improvements + +Version 5.8.1 *(2021-01-11)* +---------------------------- + + * Fixed a glitch with "Sending..." stuck at messages + * Allow selecting a phone numbers at contacts with multiple ones + * Some translation and stability improvements + Version 5.8.0 *(2021-01-02)* ---------------------------- diff --git a/README.md b/README.md index 6ab5c2c8..34019b8a 100644 --- a/README.md +++ b/README.md @@ -11,20 +11,21 @@ It comes with material design and dark theme by default, provides great user exp Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. -Check out the full suite of Simple Tools here: +Check out the full suite of Simple Tools here: https://www.simplemobiletools.com -Facebook: +Facebook: https://www.facebook.com/simplemobiletools -Reddit: +Reddit: https://www.reddit.com/r/SimpleMobileTools Get it on Google Play Get it on F-Droid
-App image -App image +App image +App image +App image
diff --git a/app/build.gradle b/app/build.gradle index 91ee3631..e52f8787 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 30 - versionCode 25 - versionName "5.8.0" + versionCode 29 + versionName "5.9.0" setProperty("archivesBaseName", "sms-messenger") } @@ -56,10 +56,10 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.32.20' + implementation 'com.simplemobiletools:commons:5.33.32' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' - implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' + implementation 'com.github.tibbi:IndicatorFastScroll:c3de1d040a' implementation "me.leolin:ShortcutBadger:1.1.22" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e542b99..0dabfa90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,21 @@ android:name=".activities.ThreadActivity" android:parentActivityName=".activities.MainActivity" /> + + + + + + + + + diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt index 58550850..6196adb6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -100,11 +100,13 @@ class MainActivity : SimpleActivity() { override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main, menu) + updateMenuItemColors(menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { + R.id.search -> launchSearch() R.id.settings -> launchSettings() R.id.about -> launchAbout() else -> return super.onOptionsItemSelected(item) @@ -295,6 +297,10 @@ class MainActivity : SimpleActivity() { .build() } + private fun launchSearch() { + startActivity(Intent(applicationContext, SearchActivity::class.java)) + } + private fun launchSettings() { startActivity(Intent(applicationContext, SettingsActivity::class.java)) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt index ae831c2e..88549ae2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -7,8 +7,10 @@ import android.view.Menu import android.view.WindowManager import com.google.gson.Gson import com.reddit.indicatorfastscroll.FastScrollItemIndicator +import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.ContactsAdapter @@ -87,9 +89,12 @@ class NewConversationActivity : SimpleActivity() { } } + val adjustedPrimaryColor = getAdjustedPrimaryColor() contacts_letter_fastscroller.textColor = config.textColor.getColorStateList() + contacts_letter_fastscroller.pressedTextColor = adjustedPrimaryColor contacts_letter_fastscroller_thumb.setupWithFastScroller(contacts_letter_fastscroller) - contacts_letter_fastscroller_thumb.textColor = config.primaryColor.getContrastColor() + contacts_letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor() + contacts_letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList() } private fun isThirdPartyIntent(): Boolean { @@ -132,7 +137,20 @@ class NewConversationActivity : SimpleActivity() { ContactsAdapter(this, contacts, contacts_list, null) { hideKeyboard() - launchThreadActivity((it as SimpleContact).phoneNumbers.first(), it.name) + val contact = it as SimpleContact + val phoneNumbers = contact.phoneNumbers + if (phoneNumbers.size > 1) { + val items = ArrayList() + phoneNumbers.forEachIndexed { index, phoneNumber -> + items.add(RadioItem(index, phoneNumber, phoneNumber)) + } + + RadioGroupDialog(this, items) { + launchThreadActivity(it as String, contact.name) + } + } else { + launchThreadActivity(phoneNumbers.first(), contact.name) + } }.apply { contacts_list.adapter = this } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SearchActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SearchActivity.kt new file mode 100644 index 00000000..a3ea9ad5 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SearchActivity.kt @@ -0,0 +1,146 @@ +package com.simplemobiletools.smsmessenger.activities + +import android.annotation.SuppressLint +import android.app.SearchManager +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.text.TextUtils +import android.util.TypedValue +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuItemCompat +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.adapters.SearchResultsAdapter +import com.simplemobiletools.smsmessenger.extensions.conversationsDB +import com.simplemobiletools.smsmessenger.extensions.messagesDB +import com.simplemobiletools.smsmessenger.helpers.SEARCHED_MESSAGE_ID +import com.simplemobiletools.smsmessenger.helpers.THREAD_ID +import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE +import com.simplemobiletools.smsmessenger.models.Conversation +import com.simplemobiletools.smsmessenger.models.Message +import com.simplemobiletools.smsmessenger.models.SearchResult +import kotlinx.android.synthetic.main.activity_search.* + +class SearchActivity : SimpleActivity() { + private var mIsSearchOpen = false + private var mLastSearchedText = "" + private var mSearchMenuItem: MenuItem? = null + + @SuppressLint("InlinedApi") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_search) + updateTextColors(search_holder) + search_placeholder.setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize()) + search_placeholder_2.setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize()) + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_search, menu) + setupSearch(menu) + return true + } + + private fun setupSearch(menu: Menu) { + val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager + mSearchMenuItem = menu.findItem(R.id.search) + + MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener { + override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + mIsSearchOpen = true + return true + } + + // this triggers on device rotation too, avoid doing anything + override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + if (mIsSearchOpen) { + mIsSearchOpen = false + mLastSearchedText = "" + finish() + } + return true + } + }) + + mSearchMenuItem?.expandActionView() + (mSearchMenuItem?.actionView as? SearchView)?.apply { + setSearchableInfo(searchManager.getSearchableInfo(componentName)) + isSubmitButtonEnabled = false + setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String) = false + + override fun onQueryTextChange(newText: String): Boolean { + if (mIsSearchOpen) { + mLastSearchedText = newText + textChanged(newText) + } + return true + } + }) + } + } + + private fun textChanged(text: String) { + search_placeholder_2.beGoneIf(text.length >= 2) + if (text.length >= 2) { + ensureBackgroundThread { + val searchQuery = "%$text%" + val messages = messagesDB.getMessagesWithText(searchQuery) + val conversations = conversationsDB.getConversationsWithText(searchQuery) + if (text == mLastSearchedText) { + showSearchResults(messages, conversations, text) + + } + } + } else { + search_placeholder.beVisible() + search_results_list.beGone() + } + } + + private fun showSearchResults(messages: List, conversations: List, searchedText: String) { + val searchResults = ArrayList() + conversations.forEach { conversation -> + val date = conversation.date.formatDateOrTime(this, true, true) + val searchResult = SearchResult(-1, conversation.title, conversation.phoneNumber, date, conversation.threadId, conversation.photoUri) + searchResults.add(searchResult) + } + + messages.forEach { message -> + var recipient = message.senderName + if (recipient.isEmpty() && message.participants.isNotEmpty()) { + val participantNames = message.participants.map { it.name } + recipient = TextUtils.join(", ", participantNames) + } + + val date = message.date.formatDateOrTime(this, true, true) + val searchResult = SearchResult(message.id, recipient, message.body, date, message.threadId, message.senderPhotoUri) + searchResults.add(searchResult) + } + + runOnUiThread { + search_results_list.beVisibleIf(searchResults.isNotEmpty()) + search_placeholder.beVisibleIf(searchResults.isEmpty()) + + val currAdapter = search_results_list.adapter + if (currAdapter == null) { + SearchResultsAdapter(this, searchResults, search_results_list, searchedText) { + Intent(this, ThreadActivity::class.java).apply { + putExtra(THREAD_ID, (it as SearchResult).threadId) + putExtra(THREAD_TITLE, it.title) + putExtra(SEARCHED_MESSAGE_ID, it.messageId) + startActivity(this) + } + }.apply { + search_results_list.adapter = this + } + } else { + (currAdapter as SearchResultsAdapter).updateItems(searchResults, searchedText) + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt index c8d6949e..5b57f772 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt @@ -30,6 +30,7 @@ class SettingsActivity : SimpleActivity() { setupPurchaseThankYou() setupCustomizeColors() + setupCustomizeNotifications() setupUseEnglish() setupManageBlockedNumbers() setupChangeDateTimeFormat() @@ -66,6 +67,13 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupCustomizeNotifications() { + settings_customize_notifications_holder.beVisibleIf(isOreoPlus()) + settings_customize_notifications_holder.setOnClickListener { + launchCustomizeNotificationsIntent() + } + } + private fun setupUseEnglish() { settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en") settings_use_english.isChecked = config.useEnglish diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 881af882..2c46ac2f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.content.Intent import android.graphics.BitmapFactory import android.graphics.drawable.Drawable +import android.graphics.drawable.LayerDrawable import android.media.MediaMetadataRetriever import android.net.Uri import android.os.Bundle @@ -88,6 +89,15 @@ class ThreadActivity : SimpleActivity() { if (it) { setupButtons() setupCachedMessages { + val searchedMessageId = intent.getLongExtra(SEARCHED_MESSAGE_ID, -1L) + intent.removeExtra(SEARCHED_MESSAGE_ID) + if (searchedMessageId != -1L) { + val index = threadItems.indexOfFirst { (it as? Message)?.id == searchedMessageId } + if (index != -1) { + thread_messages_list.smoothScrollToPosition(index) + } + } + setupThread() } } else { @@ -106,62 +116,6 @@ class ThreadActivity : SimpleActivity() { isActivityVisible = false } - private fun setupThread() { - val privateCursor = getMyContactsCursor()?.loadInBackground() - ensureBackgroundThread { - val cachedMessagesCode = messages.hashCode() - messages = getMessages(threadId) - if (messages.hashCode() == cachedMessagesCode) { - return@ensureBackgroundThread - } - - setupParticipants() - - // check if no participant came from a privately stored contact in Simple Contacts - privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) - if (privateContacts.isNotEmpty()) { - val senderNumbersToReplace = HashMap() - participants.filter { it.doesContainPhoneNumber(it.name) }.forEach { participant -> - privateContacts.firstOrNull { it.doesContainPhoneNumber(participant.phoneNumbers.first()) }?.apply { - senderNumbersToReplace[participant.phoneNumbers.first()] = name - participant.name = name - participant.photoUri = photoUri - } - } - - messages.forEach { message -> - if (senderNumbersToReplace.keys.contains(message.senderName)) { - message.senderName = senderNumbersToReplace[message.senderName]!! - } - } - } - - if (participants.isEmpty()) { - val name = intent.getStringExtra(THREAD_TITLE) ?: "" - val number = intent.getStringExtra(THREAD_NUMBER) - if (number == null) { - toast(R.string.unknown_error_occurred) - finish() - return@ensureBackgroundThread - } - - val contact = SimpleContact(0, 0, name, "", arrayListOf(number), ArrayList(), ArrayList()) - participants.add(contact) - } - - messages.chunked(30).forEach { currentMessages -> - messagesDB.insertMessages(*currentMessages.toTypedArray()) - } - - setupAttachmentSizes() - setupAdapter() - runOnUiThread { - setupThreadTitle() - setupSIMSelector() - } - } - } - override fun onDestroy() { super.onDestroy() bus?.unregister(this) @@ -219,6 +173,62 @@ class ThreadActivity : SimpleActivity() { } } + private fun setupThread() { + val privateCursor = getMyContactsCursor()?.loadInBackground() + ensureBackgroundThread { + val cachedMessagesCode = messages.hashCode() + messages = getMessages(threadId) + if (messages.hashCode() == cachedMessagesCode && participants.isNotEmpty()) { + return@ensureBackgroundThread + } + + setupParticipants() + + // check if no participant came from a privately stored contact in Simple Contacts + privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + if (privateContacts.isNotEmpty()) { + val senderNumbersToReplace = HashMap() + participants.filter { it.doesContainPhoneNumber(it.name) }.forEach { participant -> + privateContacts.firstOrNull { it.doesContainPhoneNumber(participant.phoneNumbers.first()) }?.apply { + senderNumbersToReplace[participant.phoneNumbers.first()] = name + participant.name = name + participant.photoUri = photoUri + } + } + + messages.forEach { message -> + if (senderNumbersToReplace.keys.contains(message.senderName)) { + message.senderName = senderNumbersToReplace[message.senderName]!! + } + } + } + + if (participants.isEmpty()) { + val name = intent.getStringExtra(THREAD_TITLE) ?: "" + val number = intent.getStringExtra(THREAD_NUMBER) + if (number == null) { + toast(R.string.unknown_error_occurred) + finish() + return@ensureBackgroundThread + } + + val contact = SimpleContact(0, 0, name, "", arrayListOf(number), ArrayList(), ArrayList()) + participants.add(contact) + } + + messages.chunked(30).forEach { currentMessages -> + messagesDB.insertMessages(*currentMessages.toTypedArray()) + } + + setupAttachmentSizes() + setupAdapter() + runOnUiThread { + setupThreadTitle() + setupSIMSelector() + } + } + } + private fun setupAdapter() { threadItems = getThreadItems() invalidateOptionsMenu() @@ -458,11 +468,20 @@ class ThreadActivity : SimpleActivity() { } private fun showSelectedContacts() { + val adjustedColor = getAdjustedPrimaryColor() + val views = ArrayList() participants.forEach { val contact = it layoutInflater.inflate(R.layout.item_selected_contact, null).apply { + val selectedContactBg = resources.getDrawable(R.drawable.item_selected_contact_background) + (selectedContactBg as LayerDrawable).findDrawableByLayerId(R.id.selected_contact_bg).applyColorFilter(adjustedColor) + selected_contact_holder.background = selectedContactBg + selected_contact_name.text = contact.name + selected_contact_name.setTextColor(adjustedColor.getContrastColor()) + selected_contact_remove.applyColorFilter(adjustedColor.getContrastColor()) + selected_contact_remove.setOnClickListener { if (contact.rawId != participants.first().rawId) { removeSelectedContact(contact.rawId) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt index 445c8294..1f9c20de 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -5,12 +5,16 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.Filter +import android.widget.RelativeLayout import android.widget.TextView +import com.simplemobiletools.commons.extensions.darkenColor +import com.simplemobiletools.commons.extensions.getContrastColor import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity +import com.simplemobiletools.smsmessenger.extensions.config class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { var resultList = ArrayList() @@ -30,8 +34,13 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar isFocusable = false } + val backgroundColor = activity.config.backgroundColor findViewById(R.id.item_contact_name).text = contact.name findViewById(R.id.item_contact_number).text = contact.phoneNumbers.first() + findViewById(R.id.item_contact_holder).setBackgroundColor(backgroundColor.darkenColor()) + + findViewById(R.id.item_contact_name).setTextColor(backgroundColor.getContrastColor()) + findViewById(R.id.item_contact_number).setTextColor(backgroundColor.getContrastColor()) SimpleContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt index 8b1de0ca..ed8f66ae 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -232,7 +232,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis } conversation_date.apply { - text = conversation.date.formatDateOrTime(context, true) + text = conversation.date.formatDateOrTime(context, true, false) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/SearchResultsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/SearchResultsAdapter.kt new file mode 100644 index 00000000..01df81e2 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/SearchResultsAdapter.kt @@ -0,0 +1,96 @@ +package com.simplemobiletools.smsmessenger.adapters + +import android.util.TypedValue +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.bumptech.glide.Glide +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.extensions.getTextSize +import com.simplemobiletools.commons.extensions.highlightTextPart +import com.simplemobiletools.commons.helpers.SimpleContactsHelper +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.activities.SimpleActivity +import com.simplemobiletools.smsmessenger.models.SearchResult +import kotlinx.android.synthetic.main.item_search_result.view.* +import java.util.* + +class SearchResultsAdapter( + activity: SimpleActivity, var searchResults: ArrayList, recyclerView: MyRecyclerView, highlightText: String, itemClick: (Any) -> Unit +) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { + + private var fontSize = activity.getTextSize() + private var textToHighlight = highlightText + + override fun getActionMenuId() = 0 + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) {} + + override fun getSelectableItemCount() = searchResults.size + + override fun getIsItemSelectable(position: Int) = false + + override fun getItemSelectionKey(position: Int) = searchResults.getOrNull(position)?.hashCode() + + override fun getItemKeyPosition(key: Int) = searchResults.indexOfFirst { it.hashCode() == key } + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_search_result, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val searchResult = searchResults[position] + holder.bindView(searchResult, true, false) { itemView, layoutPosition -> + setupView(itemView, searchResult) + } + bindViewHolder(holder) + } + + override fun getItemCount() = searchResults.size + + fun updateItems(newItems: ArrayList, highlightText: String = "") { + if (newItems.hashCode() != searchResults.hashCode()) { + searchResults = newItems.clone() as ArrayList + textToHighlight = highlightText + notifyDataSetChanged() + } else if (textToHighlight != highlightText) { + textToHighlight = highlightText + notifyDataSetChanged() + } + } + + private fun setupView(view: View, searchResult: SearchResult) { + view.apply { + search_result_title.apply { + text = searchResult.title.highlightTextPart(textToHighlight, adjustedPrimaryColor) + setTextColor(textColor) + setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f) + } + + search_result_snippet.apply { + text = searchResult.snippet.highlightTextPart(textToHighlight, adjustedPrimaryColor) + setTextColor(textColor) + setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f) + } + + search_result_date.apply { + text = searchResult.date + setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f) + } + + SimpleContactsHelper(context).loadContactImage(searchResult.photoUri, search_result_image, searchResult.title) + } + } + + override fun onViewRecycled(holder: ViewHolder) { + super.onViewRecycled(holder) + if (!activity.isDestroyed && !activity.isFinishing && holder.itemView.search_result_image != null) { + Glide.with(activity).clear(holder.itemView.search_result_image) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index 8c6ae60b..5590a1d0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -42,8 +42,10 @@ import kotlinx.android.synthetic.main.item_thread_error.view.* import kotlinx.android.synthetic.main.item_thread_sending.view.* import kotlinx.android.synthetic.main.item_thread_success.view.* -class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller, - itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { +class ThreadAdapter( + activity: SimpleActivity, var messages: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller, + itemClick: (Any) -> Unit +) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private val roundedCornersRadius = resources.getDimension(R.dimen.normal_margin).toInt() private var fontSize = activity.getTextSize() @@ -134,17 +136,17 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList + @Query("SELECT * FROM conversations WHERE title LIKE :text") + fun getConversationsWithText(text: String): List + @Query("UPDATE conversations SET read = 1 WHERE thread_id = :threadId") fun markRead(threadId: Long) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index c3dc8d71..c4689b4d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -23,6 +23,9 @@ interface MessagesDao { @Query("SELECT * FROM messages WHERE thread_id = :threadId") fun getThreadMessages(threadId: Long): List + @Query("SELECT * FROM messages WHERE body LIKE :text") + fun getMessagesWithText(text: String): List + @Query("UPDATE messages SET read = 1 WHERE id = :id") fun markRead(id: Long) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SearchResult.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SearchResult.kt new file mode 100644 index 00000000..e6fd47ed --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SearchResult.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.smsmessenger.models + +data class SearchResult(val messageId: Long, val title: String, val snippet: String, val date: String, val threadId: Long, var photoUri: String) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusDeliveredReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusDeliveredReceiver.kt index b7aa5593..b4c805e5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusDeliveredReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusDeliveredReceiver.kt @@ -1,20 +1,20 @@ package com.simplemobiletools.smsmessenger.receivers -import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.net.Uri import android.os.Handler import android.os.Looper import android.provider.Telephony +import com.klinker.android.send_message.DeliveredReceiver import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.smsmessenger.extensions.messagesDB import com.simplemobiletools.smsmessenger.extensions.updateMessageType import com.simplemobiletools.smsmessenger.helpers.refreshMessages -class SmsStatusDeliveredReceiver : BroadcastReceiver() { +class SmsStatusDeliveredReceiver : DeliveredReceiver() { - override fun onReceive(context: Context, intent: Intent) { + override fun onMessageStatusUpdated(context: Context, intent: Intent, receiverResultCode: Int) { if (intent.extras?.containsKey("message_uri") == true) { val uri = Uri.parse(intent.getStringExtra("message_uri")) val messageId = uri?.lastPathSegment?.toLong() ?: 0L diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusSentReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusSentReceiver.kt index 6f7451f6..0418c743 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusSentReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsStatusSentReceiver.kt @@ -5,7 +5,6 @@ import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent -import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.media.AudioAttributes @@ -16,6 +15,8 @@ import android.os.Handler import android.os.Looper import android.provider.Telephony import androidx.core.app.NotificationCompat +import com.klinker.android.send_message.SentReceiver +import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor import com.simplemobiletools.commons.extensions.getMyContactsCursor import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread @@ -27,9 +28,9 @@ import com.simplemobiletools.smsmessenger.helpers.NOTIFICATION_CHANNEL import com.simplemobiletools.smsmessenger.helpers.THREAD_ID import com.simplemobiletools.smsmessenger.helpers.refreshMessages -class SmsStatusSentReceiver : BroadcastReceiver() { +class SmsStatusSentReceiver : SentReceiver() { - override fun onReceive(context: Context, intent: Intent) { + override fun onMessageStatusUpdated(context: Context, intent: Intent, receiverResultCode: Int) { if (intent.extras?.containsKey("message_uri") == true) { val uri = Uri.parse(intent.getStringExtra("message_uri")) val messageId = uri?.lastPathSegment?.toLong() ?: 0L @@ -92,7 +93,7 @@ class SmsStatusSentReceiver : BroadcastReceiver() { val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL) .setContentTitle(context.getString(R.string.message_not_sent_short)) .setContentText(summaryText) - .setColor(context.config.primaryColor) + .setColor(context.getAdjustedPrimaryColor()) .setSmallIcon(R.drawable.ic_messenger) .setLargeIcon(largeIcon) .setStyle(NotificationCompat.BigTextStyle().bigText(summaryText)) diff --git a/app/src/main/res/drawable/item_selected_contact_background.xml b/app/src/main/res/drawable/item_selected_contact_background.xml index f55fbc8f..f0d2b728 100644 --- a/app/src/main/res/drawable/item_selected_contact_background.xml +++ b/app/src/main/res/drawable/item_selected_contact_background.xml @@ -1,9 +1,12 @@ - + + + - + - + - + + + diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml new file mode 100644 index 00000000..a8e2fe2d --- /dev/null +++ b/app/src/main/res/layout/activity_search.xml @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index c71368f9..25fd8250 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -53,6 +53,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_suggested_contact.xml b/app/src/main/res/layout/item_suggested_contact.xml index 7535748b..6851fb13 100644 --- a/app/src/main/res/layout/item_suggested_contact.xml +++ b/app/src/main/res/layout/item_suggested_contact.xml @@ -3,8 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/suggested_contact_holder" android:layout_width="wrap_content" - android:background="?selectableItemBackground" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:background="?selectableItemBackground"> + + + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a861ccd0..eba10927 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2,19 +2,21 @@ Schlichter SMS Messenger SMS Messenger Schreibe eine Nachricht… - Message not sent - Not sent. Touch to retry. - Your message to \'%s\' has not been sent + Nachricht nicht versendet. + Nachricht nicht versendet. Berühre, um es erneut zu versuchen. + Deine Nachricht am \'%s\' wurde nicht gesendet. Person hinzufügen Anhang Keine gespeicherten Chats gefunden Neuen Chat beginnen Antworten - Show a character counter at writing messages - Loading messages… - Sender doesn\'t support replies - Draft - Sending… + Zeige einen Zeichenzähler während dem Schreiben von Nachrichten. + Lade Nachrichten… + Der Absender unterstützt keine Antworten. + Entwurf + Sende… + Export messages + Import messages Neuer Chat @@ -49,21 +51,21 @@ - Simple SMS Messenger - Manage messages easily + Simple SMS Messenger-Nachrichten simple verwalten - An easy and quick way of managing SMS and MMS messages without ads. + Eine einfache und schnelle Art SMS & MMS ohne Werbung zu verwalten. - A great way to stay in touch with your relatives, by sending both SMS and MMS messages. The app properly handles group messaging too, just like blocking numbers from Android 7+. + In tolle Möglichkeit mit deinen Verwandten in Kontakt zu bleiben, indem sowohl SMS als auch MMS Nachrichten gesendet werden. Die App handhabt auch Gruppennachrichten gut, genauso wie das Blockieren von Nummern ab Android 7+. - It offers many date formats to choose from, to make you feel comfortable at using it. You can toggle between 12 and 24 hours time format too. + Damit die Nutzung sich vertrauter und komfortabler anfühlt, kannst du das Datumsformat in verschiedenen Arten anpassen. Zudem kannst du zwischen 12 und 24 Stunden Format auswählen. + + Im Vergleich zur Konkurrenz ist die Appgröße sehr klein, wodurch es sehr schnell heruntergeladen ist. - It has a really tiny app size compared to the competition, making it really fast to download. + Es kommt standardmäßig mit einem material design und Dunkelmodus, was für ein großartiges Nutzererlebnis und leichte Nutzbarkeit sorgt. Da es keine Internetverbindung verwendet, bietet diese App mehr Datenschutz, Sicherheit und Stabilität als andere Apps. - It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps. + Beinhaltet keine Werbung oder unnötige Berechtigungen. Es ist komplett opensource, und bietet anpassbare Farben. - Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. - - Check out the full suite of Simple Tools here: + Entdecke alle Simple Tools hier: https://www.simplemobiletools.com Facebook: diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b6f10a90..20359d23 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Νέα συνομιλία diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3516f9ed..479f07a1 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Nueva conversación diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml new file mode 100644 index 00000000..67afb2ea --- /dev/null +++ b/app/src/main/res/values-fi/strings.xml @@ -0,0 +1,82 @@ + + Simple SMS Messenger + Viestit + Lähetä viesti… + Viestiä ei lähetetty + Ei lähetetty. Yritä uudelleen koskemalla. + Viestiäsi henkilölle \'%s\' ei lähetetty. + Lisää henkilö + Liite + Tallennettuja keskusteluja ei löytyny + Aloita keskustelu + Vastaa + Näytä merkkimäärä kirjoittaessasi viestejä + Ladataan viestejä… + Lähettäjä ei tue vastauksia + Luonnos + Lähetetään… + Export messages + Import messages + + + Uusi keskustelu + Lisää yhteystieto tai numero… + Ehdotuksia + + + Vastaanotettu tekstiviesti + Uusi viesti + Merkitse luetuksi + Merkitse lukemattomaksi + + + Haluatko varmasti poistaa kaikki tämän keskustelun viestit? + + + + yhden keskustelun + %d keskustelua + + + + + yhden viestin + %d viestiä + + + + Miksi sovellus vaatii Internet-yhteyden? + Valitettavasti sitä tarvitaan multimediaviestin-liitteiden lähettämiseen. Multimediaviestien lähettämättä jättäminen olisi todella valtava haitta muihin sovelluksiin verrattuna, joten päätimme mennä tällä tavalla. + Kuten yleensä, mainoksia, seurantaa tai analytiikkaa ei kuitenkaan ole, iternetiä käytetään vain multimediaviestien lähettämiseen. + + + + Simple SMS Messenger - Manage messages easily + + An easy and quick way of managing SMS and MMS messages without ads. + + A great way to stay in touch with your relatives, by sending both SMS and MMS messages. The app properly handles group messaging too, just like blocking numbers from Android 7+. + + It offers many date formats to choose from, to make you feel comfortable at using it. You can toggle between 12 and 24 hours time format too. + + It has a really tiny app size compared to the competition, making it really fast to download. + + It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps. + + Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. + + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b418260b..7e5952e1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Nouvelle conversation diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index df73b0b3..3c77b619 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Percakapan baru diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml new file mode 100644 index 00000000..150a384e --- /dev/null +++ b/app/src/main/res/values-it/strings.xml @@ -0,0 +1,81 @@ + + SMS Messenger + SMS Messenger + Componi messaggio + Messaggio non inviato + Non inviato. Tocca per riprovare + Il tuo messaggio a \'%s\' non è stato inviato + Aggiungi persona + Allegato + Nessuna conversazione trovata + Inizia conversazione + Rispondi + Mostra contatore caratteri + Caricamento messaggi… + Il mittente non accetta risposte + Bozza + Invio… + Export messages + Import messages + + + Nuova conversazione + Inserisci contatto o numero… + Suggerimenti + + + SMS ricevuto + Nuovo messaggio + Letto + Non letto + + + Vuoi cancellare l\'intera conversazione? + + + + %d conversazione + %d conversazioni + + + + + %d messaggio + %d messaggi + + + + Perché l\'applicazione richiede l\'accesso ad internet? + Purtroppo è necessario per poter inviare gli allegati degli MMS. Non essere in grado di inviare gli MMS sarebbe un grosso svantaggio in confronto ad altre applicazioni, quindi abbiamo deciso di intraprendere questa strada. + Ad ogni modo, come sempre, non ci sono pubblicità o tracciamenti, internet è utilizzato soltanto per l\'invio degli MMS. + + + + Simple SMS Messenger - Manage messages easily + + An easy and quick way of managing SMS and MMS messages without ads. + + A great way to stay in touch with your relatives, by sending both SMS and MMS messages. The app properly handles group messaging too, just like blocking numbers from Android 7+. + + It offers many date formats to choose from, to make you feel comfortable at using it. You can toggle between 12 and 24 hours time format too. + + It has a really tiny app size compared to the competition, making it really fast to download. + + It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps. + + Neturi reklamų ar nereikalingų leidimų. Programėlė visiškai atviro kodo, yra galimybė keisti spalvas. + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 356e1f19..a0a5cb95 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages 新しい会話 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1d10f2cf..1d8cc5e3 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Naujas pokalbis diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 4eafaf66..e9d0b8ed 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages പുതിയ സംഭാഷണം diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3d8ef86c..0e2a4ccd 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -2,9 +2,9 @@ Eenvoudig Berichtenbeheer (SMS) Berichten Typ een bericht… - Message not sent - Not sent. Touch to retry. - Your message to \'%s\' has not been sent + Bericht niet verzonden + Niet verzonden. Probeer het nogmaals. + Bericht naar \'%s\' is niet verzonden Persoon toevoegen Bijlage Geen opgeslagen berichten gevonden @@ -15,6 +15,8 @@ Afzender ondersteunt geen antwoorden Concept Versturen… + Berichten exporteren + Berichten importeren Nieuw gesprek diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index a2c51645..b7add852 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -2,19 +2,21 @@ Simple SMS Messenger SMS Messenger Escrever uma mensagem… - Message not sent - Not sent. Touch to retry. - Your message to \'%s\' has not been sent + Mensagem não enviada + Não enviada. Toque para tentar novamente. + A mensagem enviada para \'%s\' não foi enviada. Adicionar pessoa Anexo Não foram encontradas conversas Iniciar uma conversa Responder Mostrar número de caracteres ao escrever a mensagem - Loading messages… - Sender doesn\'t support replies - Draft - Sending… + A carregar mensagens… + O remetente não aceita respostas + Rascunho + A enviar… + Export messages + Import messages Nova conversa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 33275eee..ce28ceb2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -15,6 +15,8 @@ Отправитель не поддерживает ответы Черновик Отправка… + Export messages + Import messages Новая переписка diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 54a8271f..814a4c0f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Koncept Odosiela sa… + Exportovať správy + Importovať správy Nová konverzácia diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 3f55992f..f23b8a0d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Yeni görüşme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 338bb279..a2787b8b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages Нове листування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 2abf8998..36f0de29 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages 新的对话 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c40c26d6..5cf58c57 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,8 @@ Sender doesn\'t support replies Draft Sending… + Export messages + Import messages New conversation diff --git a/app/src/main/res/xml/searchable.xml b/app/src/main/res/xml/searchable.xml new file mode 100644 index 00000000..892fa25a --- /dev/null +++ b/app/src/main/res/xml/searchable.xml @@ -0,0 +1,5 @@ + + diff --git a/build.gradle b/build.gradle index b604e4eb..29189fd5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.21' + ext.kotlin_version = '1.4.30' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.1' + classpath 'com.android.tools.build:gradle:4.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/fastlane/metadata/android/en-US/changelogs/26.txt b/fastlane/metadata/android/en-US/changelogs/26.txt new file mode 100644 index 00000000..914590da --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/26.txt @@ -0,0 +1,3 @@ + * Fixed a glitch with "Sending..." stuck at messages + * Allow selecting a phone numbers at contacts with multiple ones + * Some translation and stability improvements diff --git a/fastlane/metadata/android/en-US/changelogs/27.txt b/fastlane/metadata/android/en-US/changelogs/27.txt new file mode 100644 index 00000000..10157d25 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/27.txt @@ -0,0 +1,3 @@ + * Fixed a glitch with inability to send messages in empty conversations + * Adding a settings item for quickly getting into notification settings + * Some stability and translation improvements diff --git a/fastlane/metadata/android/en-US/changelogs/28.txt b/fastlane/metadata/android/en-US/changelogs/28.txt new file mode 100644 index 00000000..6a73d43f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/28.txt @@ -0,0 +1 @@ + * Adding some stability and translation improvements diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt new file mode 100644 index 00000000..09a9182e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -0,0 +1,3 @@ + * Added Search + * Added a White theme with special handling + * Some stability and translation improvements diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg deleted file mode 100644 index 6e9ebf4e..00000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg deleted file mode 100644 index b66c01c5..00000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg deleted file mode 100644 index 6fa74117..00000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg new file mode 100644 index 00000000..2c6f62d1 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/english/2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/2.jpg new file mode 100644 index 00000000..ea78e479 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/2.jpg differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/english/3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/3.jpg new file mode 100644 index 00000000..dc5ac2cc Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/3.jpg differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/english/4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/4.jpg new file mode 100644 index 00000000..e1ff8478 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/english/4.jpg differ