From fb5f67d5b67aa61de2de3dfee98d55de48806aa7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 15 Apr 2020 21:15:10 +0200 Subject: [PATCH 01/37] check if the SMS Role exists before relying on it --- app/build.gradle | 2 +- .../smsmessenger/activities/MainActivity.kt | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bcdd855a..b823d54a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.25.19' + implementation 'com.simplemobiletools:commons:5.25.21' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' 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 42bacce7..4e9ae074 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -48,11 +48,16 @@ class MainActivity : SimpleActivity() { if (isQPlus()) { val roleManager = getSystemService(RoleManager::class.java) - if (roleManager!!.isRoleHeld(RoleManager.ROLE_SMS)) { - askPermissions() + if (roleManager!!.isRoleAvailable(RoleManager.ROLE_SMS)) { + if (roleManager.isRoleHeld(RoleManager.ROLE_SMS)) { + askPermissions() + } else { + val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS) + startActivityForResult(intent, MAKE_DEFAULT_APP_REQUEST) + } } else { - val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS) - startActivityForResult(intent, MAKE_DEFAULT_APP_REQUEST) + toast(R.string.unknown_error_occurred) + finish() } } else { if (Telephony.Sms.getDefaultSmsPackage(this) == packageName) { From 4bb6f47f1b8de978bb9a5e7b33ec50de0f08143d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 20:39:37 +0200 Subject: [PATCH 02/37] ignore blocked numbers below Android 7 --- app/build.gradle | 2 +- app/proguard-rules.pro | 27 +++++-------------- .../smsmessenger/activities/ThreadActivity.kt | 2 ++ .../smsmessenger/extensions/Context.kt | 4 +++ 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b823d54a..a51c7b78 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.25.21' + implementation 'com.simplemobiletools:commons:5.26.4' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index f1b42451..e6c59860 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,21 +1,6 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile +# EventBus +-keepattributes *Annotation* +-keepclassmembers class ** { + @org.greenrobot.eventbus.Subscribe ; +} +-keep enum org.greenrobot.eventbus.ThreadMode { *; } 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 e6572c9e..f5a03c70 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -29,6 +29,7 @@ import com.klinker.android.send_message.Transaction import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter @@ -146,6 +147,7 @@ class ThreadActivity : SimpleActivity() { menuInflater.inflate(R.menu.menu_thread, menu) menu.apply { findItem(R.id.delete).isVisible = threadItems.isNotEmpty() + findItem(R.id.block_number).isVisible = isNougatPlus() } return true diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 988b70ef..4cae6460 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -619,6 +619,10 @@ fun Context.getThreadId(addresses: Set): Long { } fun Context.isNumberBlocked(number: String): Boolean { + if (!isNougatPlus()) { + return false + } + val blockedNumbers = getBlockedNumbers() val numberToCompare = number.trimToComparableNumber() return blockedNumbers.map { it.numberToCompare }.contains(numberToCompare) || blockedNumbers.map { it.number }.contains(numberToCompare) From 4b3051a845ddcf58b5f5700bb83badab24a7939d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 20:41:12 +0200 Subject: [PATCH 03/37] catch and show exceptions thrown at sending messages --- .../smsmessenger/activities/ThreadActivity.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 f5a03c70..f713ca91 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -432,12 +432,16 @@ class ThreadActivity : SimpleActivity() { } } - transaction.sendNewMessage(message, threadId.toLong()) + try { + transaction.sendNewMessage(message, threadId.toLong()) - thread_type_message.setText("") - attachmentUris.clear() - thread_attachments_holder.beGone() - thread_attachments_wrapper.removeAllViews() + thread_type_message.setText("") + attachmentUris.clear() + thread_attachments_holder.beGone() + thread_attachments_wrapper.removeAllViews() + } catch (e: Exception) { + showErrorToast(e) + } } // show selected contacts, properly split to new lines when appropriate From aea826b57c6d03e51881e921d25a6f56dd7133de Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 20:55:48 +0200 Subject: [PATCH 04/37] properly handle multipart longer sms messages --- .../smsmessenger/receivers/SmsReceiver.kt | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt index f401ed62..5262ae0e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -13,22 +13,26 @@ import com.simplemobiletools.smsmessenger.helpers.refreshMessages class SmsReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val messages = Telephony.Sms.Intents.getMessagesFromIntent(intent) - messages.forEach { - val address = it.originatingAddress ?: "" - if (context.isNumberBlocked(address)) { - return@forEach - } + var address = "" + var body = "" + var subject = "" + var date = 0L + var threadId = 0L + val type = Telephony.Sms.MESSAGE_TYPE_INBOX + val read = 0 - val subject = it.pseudoSubject - val body = it.messageBody - val date = it.timestampMillis - val threadId = context.getThreadId(address) - val type = Telephony.Sms.MESSAGE_TYPE_INBOX - val read = 0 - context.insertNewSMS(address, subject, body, date, read, threadId, type) - context.showReceivedMessageNotification(address, body, threadId.toInt()) + messages.forEach { + address = it.originatingAddress ?: "" + subject = it.pseudoSubject + body += it.messageBody + date = it.timestampMillis + threadId = context.getThreadId(address) } - refreshMessages() + if (!context.isNumberBlocked(address)) { + context.insertNewSMS(address, subject, body, date, read, threadId, type) + context.showReceivedMessageNotification(address, body, threadId.toInt()) + refreshMessages() + } } } From ebf2234f3f1d1b211052f49623b78d08246b8618 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 21:25:21 +0200 Subject: [PATCH 05/37] update commons to 5.26.5 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a51c7b78..b9cdd846 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.26.4' + implementation 'com.simplemobiletools:commons:5.26.5' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' From 5db169569232bea4bab7dc009850ff06c97bed5c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 21:29:01 +0200 Subject: [PATCH 06/37] make sure to always update the top menu colors --- .../smsmessenger/activities/NewConversationActivity.kt | 6 ++++++ .../smsmessenger/activities/SettingsActivity.kt | 8 +++++++- .../smsmessenger/activities/ThreadActivity.kt | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) 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 49850c06..309a8026 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.smsmessenger.activities import android.content.Intent import android.net.Uri import android.os.Bundle +import android.view.Menu import android.view.WindowManager import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* @@ -42,6 +43,11 @@ class NewConversationActivity : SimpleActivity() { no_contacts_placeholder_2.underlineText() } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + updateMenuItemColors(menu) + return super.onCreateOptionsMenu(menu) + } + private fun initContacts() { if (isThirdPartyIntent()) { return 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 989aa0f9..885e3f69 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt @@ -4,6 +4,7 @@ import android.annotation.TargetApi import android.content.Intent import android.os.Build import android.os.Bundle +import android.view.Menu import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity import com.simplemobiletools.commons.dialogs.ChangeDateTimeFormatDialog import com.simplemobiletools.commons.extensions.* @@ -15,7 +16,7 @@ import kotlinx.android.synthetic.main.activity_settings.* import java.util.* class SettingsActivity : SimpleActivity() { - var blockedNumbersAtPause = -1 + private var blockedNumbersAtPause = -1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -42,6 +43,11 @@ class SettingsActivity : SimpleActivity() { blockedNumbersAtPause = getBlockedNumbers().hashCode() } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + updateMenuItemColors(menu) + return super.onCreateOptionsMenu(menu) + } + private fun setupPurchaseThankYou() { settings_purchase_thank_you_holder.beVisibleIf(!isThankYouInstalled()) settings_purchase_thank_you_holder.setOnClickListener { 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 f713ca91..50ef2da0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -150,6 +150,7 @@ class ThreadActivity : SimpleActivity() { findItem(R.id.block_number).isVisible = isNougatPlus() } + updateMenuItemColors(menu) return true } From 8c202b62ae0767e35b7b27f37b17724cd698a8be Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 21:34:06 +0200 Subject: [PATCH 07/37] update version to 5.0.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b9cdd846..0ebb0ce1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 21 targetSdkVersion 29 - versionCode 1 - versionName "5.0.0" + versionCode 2 + versionName "5.0.1" setProperty("archivesBaseName", "sms-messenger") } From ebdd1f22d8937626840d24de7fc30ce48c7e2cc3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 19 Apr 2020 21:34:12 +0200 Subject: [PATCH 08/37] updating changelog --- CHANGELOG.md | 8 ++++++++ fastlane/metadata/android/en-US/changelogs/2.txt | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/2.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dbd42a6..01ad5fd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========== +Version 5.0.1 *(2020-04-19)* +---------------------------- + + * Properly handle incoming multipart SMS messages + * Fixed a couple coloring issues + * Do not allow attempts to block a number below Android 7 + * A couple other translation, stability and UI improvements + Version 5.0.0 *(2020-04-14)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/2.txt b/fastlane/metadata/android/en-US/changelogs/2.txt new file mode 100644 index 00000000..1733484b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/2.txt @@ -0,0 +1,4 @@ + * Properly handle incoming multipart SMS messages + * Fixed a couple coloring issues + * Do not allow attempts to block a number below Android 7 + * A couple other translation, stability and UI improvements From 87f10f88cfa0183988ec160a4b6fb30bf7c110de Mon Sep 17 00:00:00 2001 From: Vytautas Gumbakis Date: Thu, 23 Apr 2020 00:50:23 +0300 Subject: [PATCH 09/37] Create lithuanian strings.xml --- app/src/main/res/values-lt/strings.xml | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 app/src/main/res/values-lt/strings.xml diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml new file mode 100644 index 00000000..775763bb --- /dev/null +++ b/app/src/main/res/values-lt/strings.xml @@ -0,0 +1,69 @@ + + Paprastas SMS Siuntiklis + SMS Siuntiklis + Rašykite žinutę… + Žinutė neišsiųsta. + Pridėti žmogų + Priedas + Nebuvo rasta išsaugotų pokalbių + Pradėtipokalbį + + + Naujas pokalbis + Pridėti kontaktą arba numerį… + Pasiūlymai + + + Gautos žinutės + Nauja žinutė + + + Ar tikrai norite ištrinti visas šio pokalbio žinutes? + + + + %d pokalbis + %d pokalbiai + + + + + %d žinutė + %d žinutės + + + + Why does the app require access to the internet? + Sadly it is needed for sending MMS attachments. Not being able to send MMS would be a really huge disadvantage compared to other apps, so we decided to go this way. + However, as usually, there are no ads, tracking or analytics whatsoever, the internet is used only for sending 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 + + + + From 502f68d7fab7c07abf84a99df50d9ab247509104 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 27 Apr 2020 22:30:33 +0200 Subject: [PATCH 10/37] decode the received number at third party intents --- app/build.gradle | 2 +- .../smsmessenger/activities/NewConversationActivity.kt | 3 ++- app/src/main/res/layout/item_received_message.xml | 2 +- app/src/main/res/layout/item_sent_message.xml | 2 +- build.gradle | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0ebb0ce1..a222684b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.26.5' + implementation 'com.simplemobiletools:commons:5.26.27' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' 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 309a8026..f6eb6fc6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.Contact import kotlinx.android.synthetic.main.activity_conversation.* import kotlinx.android.synthetic.main.item_suggested_contact.view.* +import java.net.URLDecoder import java.util.* import kotlin.collections.ArrayList @@ -91,7 +92,7 @@ class NewConversationActivity : SimpleActivity() { private fun isThirdPartyIntent(): Boolean { if (intent.action == Intent.ACTION_SENDTO && intent.dataString != null) { val number = intent.dataString!!.removePrefix("sms:").removePrefix("smsto:").removePrefix("mms").removePrefix("mmsto:").trim() - launchThreadActivity(number, "") + launchThreadActivity(URLDecoder.decode(number), "") return true } return false diff --git a/app/src/main/res/layout/item_received_message.xml b/app/src/main/res/layout/item_received_message.xml index 604fdef5..f6293f44 100644 --- a/app/src/main/res/layout/item_received_message.xml +++ b/app/src/main/res/layout/item_received_message.xml @@ -44,7 +44,7 @@ android:layout_alignBottom="@+id/thread_mesage_attachments_holder" android:layout_marginStart="@dimen/medium_margin" android:layout_marginBottom="@dimen/activity_margin" - android:src="@drawable/ic_play_outline" + android:src="@drawable/ic_play_outline_vector" android:visibility="gone" /> Date: Wed, 29 Apr 2020 22:27:40 +0100 Subject: [PATCH 11/37] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b85789dc..98954d37 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -4,12 +4,12 @@ Escreva uma mensagem… Mensagem não enviada. Adicionar pessoa - Attachment - No stored conversations have been found - Start a conversation + Anexo + Não foram encontradas conversas + Iniciar uma conversa - New conversation + Nova conversa Adicionar contacto ou número… Sugestões @@ -39,21 +39,21 @@ - Simple SMS Messenger - Manage messages easily + Simple SMS Messenger - Gestão de mensagens - An easy and quick way of managing SMS and MMS messages without ads. + Aplicação simples para gerir SMS e MMS, sem anúncios. - 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+. + Uma excelente forma para manter o contacto com os seus amigos e familiares. Também pode ser utilizada para mensagens de grupo e possibilita bloqueio de números de telefone em versões 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. + Permite a utilização de vários formatos de data. Também pode alternar o formato das horas. - It has a really tiny app size compared to the competition, making it really fast to download. + É uma aplicação pequena - comparada com as aplicações do mesmo género - o que torna a sua descarga muito rápida. - 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. + Disponibiliza um design atrativo e um tema escuro por omissão. A não utilização da permissão Internet providencia-lhe mais privacidade, segurança e estabilidade do que as outras aplicações. - Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. + Não contém anúncios nem permissões desnecessárias. É open source e permite a personalização de cores. - Check out the full suite of Simple Tools here: + Consulte o conjunto completo de aplicações Simple aqui: https://www.simplemobiletools.com Facebook: From 6db8d2a2d3e27ad6c978c5a1d1ced8fae432b73c Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 May 2020 00:12:22 +0200 Subject: [PATCH 12/37] fix a glitch at setting the received sms time in the future --- .../com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt index 5262ae0e..3649bc9d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -25,7 +25,7 @@ class SmsReceiver : BroadcastReceiver() { address = it.originatingAddress ?: "" subject = it.pseudoSubject body += it.messageBody - date = it.timestampMillis + date = Math.min(it.timestampMillis, System.currentTimeMillis()) threadId = context.getThreadId(address) } From ebe1ab967f941ab500205a81611a328834033ab7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 May 2020 11:08:48 +0200 Subject: [PATCH 13/37] moving some helper functions into Commons --- app/build.gradle | 2 +- .../smsmessenger/extensions/Context.kt | 48 ------------------- 2 files changed, 1 insertion(+), 49 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a222684b..4977e210 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.26.27' + implementation 'com.simplemobiletools:commons:5.27.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 4cae6460..29ffa594 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -435,54 +435,6 @@ fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto? { return NamePhoto(number, null) } -fun Context.getNameFromPhoneNumber(number: String): String { - if (!hasPermission(PERMISSION_READ_CONTACTS)) { - return number - } - - val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)) - val projection = arrayOf( - PhoneLookup.DISPLAY_NAME - ) - - try { - val cursor = contentResolver.query(uri, projection, null, null, null) - cursor.use { - if (cursor?.moveToFirst() == true) { - return cursor.getStringValue(PhoneLookup.DISPLAY_NAME) - } - } - } catch (e: Exception) { - showErrorToast(e) - } - - return number -} - -fun Context.getPhotoUriFromPhoneNumber(number: String): String { - if (!hasPermission(PERMISSION_READ_CONTACTS)) { - return "" - } - - val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)) - val projection = arrayOf( - PhoneLookup.PHOTO_URI - ) - - try { - val cursor = contentResolver.query(uri, projection, null, null, null) - cursor.use { - if (cursor?.moveToFirst() == true) { - return cursor.getStringValue(PhoneLookup.PHOTO_URI) ?: "" - } - } - } catch (e: Exception) { - showErrorToast(e) - } - - return "" -} - fun Context.getContactNames(): List { val contacts = ArrayList() val uri = ContactsContract.Data.CONTENT_URI From d5c9cd5cee4d83d36e4eb81dcf400d3ac4efaeaf Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 21:15:08 +0200 Subject: [PATCH 14/37] properly align received unknown attachment message --- app/src/main/res/layout/item_received_message.xml | 2 +- app/src/main/res/layout/item_received_unknown_attachment.xml | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/item_received_message.xml b/app/src/main/res/layout/item_received_message.xml index f6293f44..60c96090 100644 --- a/app/src/main/res/layout/item_received_message.xml +++ b/app/src/main/res/layout/item_received_message.xml @@ -33,7 +33,7 @@ android:id="@+id/thread_mesage_attachments_holder" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_alignStart="@+id/thread_message_body" + android:layout_toEndOf="@+id/thread_message_sender_photo" android:orientation="vertical" /> + android:layout_height="wrap_content"> Date: Sun, 3 May 2020 21:22:05 +0200 Subject: [PATCH 15/37] show 100 latest messages, not oldest --- app/build.gradle | 2 +- .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4977e210..b8a78791 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.0' + implementation 'com.simplemobiletools:commons:5.27.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 29ffa594..e62461c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -54,7 +54,7 @@ fun Context.getMessages(threadId: Int): ArrayList { val selection = "${Sms.THREAD_ID} = ?" val selectionArgs = arrayOf(threadId.toString()) - val sortOrder = "${Sms._ID} LIMIT 100" + val sortOrder = "${Sms._ID} DESC LIMIT 100" var messages = ArrayList() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> From eff3b70c933b917e502351dca00f91a6a47b639a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 22:06:21 +0200 Subject: [PATCH 16/37] increase min SDK version to 22 to improve multi-SIM support --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b8a78791..ced4e627 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { defaultConfig { applicationId "com.simplemobiletools.smsmessenger" - minSdkVersion 21 + minSdkVersion 22 targetSdkVersion 29 versionCode 2 versionName "5.0.1" From 49a7cd98f524eba661ade7701f62149dbd789500 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 22:33:32 +0200 Subject: [PATCH 17/37] show a Select SIM button at message sending, if multiple are available --- app/src/main/AndroidManifest.xml | 1 + .../smsmessenger/activities/ThreadActivity.kt | 31 +++++++++++++++++-- app/src/main/res/drawable/ic_sim_vector.xml | 9 ++++++ app/src/main/res/layout/activity_thread.xml | 26 +++++++++++++++- 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_sim_vector.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa47cb62..d8073b3d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + 1) { + thread_select_sim_icon.applyColorFilter(textColor) + thread_select_sim_icon.beVisible() + thread_select_sim_icon.setOnClickListener { + + } + + thread_select_sim_number.setTextColor(textColor.getContrastColor()) + thread_select_sim_number.text = "1" + } } private fun blockNumber() { @@ -422,6 +446,7 @@ class ThreadActivity : SimpleActivity() { val numbers = participants.map { it.phoneNumber }.toTypedArray() val settings = Settings() settings.useSystemSending = true + val transaction = Transaction(this, settings) val message = com.klinker.android.send_message.Message(msg, numbers) diff --git a/app/src/main/res/drawable/ic_sim_vector.xml b/app/src/main/res/drawable/ic_sim_vector.xml new file mode 100644 index 00000000..085a7187 --- /dev/null +++ b/app/src/main/res/drawable/ic_sim_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index de078daf..6642f5d3 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -156,13 +156,37 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginEnd="@dimen/small_margin" - android:layout_toStartOf="@+id/thread_send_message" + android:layout_toStartOf="@+id/thread_select_sim_icon" android:layout_toEndOf="@+id/thread_add_attachment" android:background="@android:color/transparent" android:gravity="center_vertical" android:hint="@string/type_a_message" android:minHeight="@dimen/normal_icon_size" /> + + + + Date: Sun, 3 May 2020 22:57:31 +0200 Subject: [PATCH 18/37] allow toggling SIM cards at sending messages --- .../smsmessenger/activities/ThreadActivity.kt | 26 ++++++++++++++++++- .../smsmessenger/models/SIMCard.kt | 3 +++ app/src/main/res/layout/activity_thread.xml | 4 ++- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SIMCard.kt 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 d0a484ce..c6d67219 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -50,10 +50,12 @@ class ThreadActivity : SimpleActivity() { private val PICK_ATTACHMENT_INTENT = 1 private var threadId = 0 + private var currentSIMCardIndex = 0 private var threadItems = ArrayList() private var bus: EventBus? = null private var participants = ArrayList() private var messages = ArrayList() + private val availableSIMCards = ArrayList() private var attachmentUris = LinkedHashSet() override fun onCreate(savedInstanceState: Bundle?) { @@ -266,10 +268,27 @@ class ThreadActivity : SimpleActivity() { val availableSIMs = SubscriptionManager.from(this).activeSubscriptionInfoList if (availableSIMs.size > 1) { + availableSIMs.forEachIndexed { index, subscriptionInfo -> + var label = subscriptionInfo.displayName.toString() + if (subscriptionInfo.number.isNotEmpty()) { + label += " (${subscriptionInfo.number})" + } + val SIMCard = SIMCard(index + 1, subscriptionInfo.subscriptionId, label) + availableSIMCards.add(SIMCard) + } + + currentSIMCardIndex = 0 thread_select_sim_icon.applyColorFilter(textColor) thread_select_sim_icon.beVisible() - thread_select_sim_icon.setOnClickListener { + thread_select_sim_number.beVisible() + if (availableSIMCards.isNotEmpty()) { + thread_select_sim_icon.setOnClickListener { + currentSIMCardIndex = (currentSIMCardIndex + 1) % availableSIMCards.size + val currentSIMCard = availableSIMCards[currentSIMCardIndex] + thread_select_sim_number.text = currentSIMCard.id.toString() + toast(currentSIMCard.label) + } } thread_select_sim_number.setTextColor(textColor.getContrastColor()) @@ -447,6 +466,11 @@ class ThreadActivity : SimpleActivity() { val settings = Settings() settings.useSystemSending = true + val SIMId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId + if (SIMId != null) { + settings.subscriptionId = SIMId + } + val transaction = Transaction(this, settings) val message = com.klinker.android.send_message.Message(msg, numbers) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SIMCard.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SIMCard.kt new file mode 100644 index 00000000..4d38b14b --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/SIMCard.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.smsmessenger.models + +data class SIMCard(val id: Int, val subscriptionId: Int, val label: String) diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index 6642f5d3..3978a078 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -173,7 +173,8 @@ android:alpha="0.9" android:background="?selectableItemBackgroundBorderless" android:padding="@dimen/normal_margin" - android:src="@drawable/ic_sim_vector" /> + android:src="@drawable/ic_sim_vector" + android:visibility="gone" /> Date: Sun, 3 May 2020 23:12:00 +0200 Subject: [PATCH 19/37] remember the last used SIM card on a per-number basis --- .../smsmessenger/activities/ThreadActivity.kt | 19 +++++++++++++++---- .../smsmessenger/extensions/Collections.kt | 11 +++++++++++ .../smsmessenger/helpers/Config.kt | 6 ++++++ .../smsmessenger/helpers/Constants.kt | 5 +---- 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Collections.kt 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 c6d67219..de0a80c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.smsmessenger.activities +import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.graphics.BitmapFactory @@ -146,6 +147,8 @@ class ThreadActivity : SimpleActivity() { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) thread_type_message.requestFocus() } + + setupSIMSelector() } } setupButtons() @@ -265,7 +268,10 @@ class ThreadActivity : SimpleActivity() { addAttachment(it) } } + } + @SuppressLint("MissingPermission") + private fun setupSIMSelector() { val availableSIMs = SubscriptionManager.from(this).activeSubscriptionInfoList if (availableSIMs.size > 1) { availableSIMs.forEachIndexed { index, subscriptionInfo -> @@ -277,8 +283,10 @@ class ThreadActivity : SimpleActivity() { availableSIMCards.add(SIMCard) } - currentSIMCardIndex = 0 - thread_select_sim_icon.applyColorFilter(textColor) + val numbers = participants.map { it.phoneNumber }.toTypedArray() + currentSIMCardIndex = availableSIMs.indexOfFirstOrNull { it.subscriptionId == config.getUseSIMIdAtNumber(numbers.first()) } ?: 0 + + thread_select_sim_icon.applyColorFilter(config.textColor) thread_select_sim_icon.beVisible() thread_select_sim_number.beVisible() @@ -291,8 +299,8 @@ class ThreadActivity : SimpleActivity() { } } - thread_select_sim_number.setTextColor(textColor.getContrastColor()) - thread_select_sim_number.text = "1" + thread_select_sim_number.setTextColor(config.textColor.getContrastColor()) + thread_select_sim_number.text = (availableSIMCards[currentSIMCardIndex].id).toString() } } @@ -469,6 +477,9 @@ class ThreadActivity : SimpleActivity() { val SIMId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId if (SIMId != null) { settings.subscriptionId = SIMId + numbers.forEach { + config.saveUseSIMIdAtNumber(it, SIMId) + } } val transaction = Transaction(this, settings) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Collections.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Collections.kt new file mode 100644 index 00000000..bc2acca7 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Collections.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.smsmessenger.extensions + +inline fun List.indexOfFirstOrNull(predicate: (T) -> Boolean): Int? { + var index = 0 + for (item in this) { + if (predicate(item)) + return index + index++ + } + return null +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt index 6e7aad09..c5e95e68 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -7,4 +7,10 @@ class Config(context: Context) : BaseConfig(context) { companion object { fun newInstance(context: Context) = Config(context) } + + fun saveUseSIMIdAtNumber(number: String, SIMId: Int) { + prefs.edit().putInt(USE_SIM_ID_PREFIX + number, SIMId).apply() + } + + fun getUseSIMIdAtNumber(number: String) = prefs.getInt(USE_SIM_ID_PREFIX + number, 0) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt index fc9bc46c..33fb77fd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -9,6 +9,7 @@ const val THREAD_TEXT = "thread_text" const val THREAD_NUMBER = "thread_number" const val THREAD_ATTACHMENT_URI = "thread_attachment_uri" const val THREAD_ATTACHMENT_URIS = "thread_attachment_uris" +const val USE_SIM_ID_PREFIX = "use_sim_id_" // view types for the thread list view const val THREAD_DATE_TIME = 1 @@ -16,10 +17,6 @@ const val THREAD_RECEIVED_MESSAGE = 2 const val THREAD_SENT_MESSAGE = 3 const val THREAD_SENT_MESSAGE_ERROR = 4 -// constants used at passing info to SmsSentReceiver -const val MESSAGE_BODY = "message_body" -const val MESSAGE_ADDRESS = "message_address" - fun refreshMessages() { EventBus.getDefault().post(Events.RefreshMessages()) } From 96e78e3ddc7378a471f0d1e7c40d5c9ed1491abb Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 23:20:03 +0200 Subject: [PATCH 20/37] adding the portugal and russian app translations into fastlane --- .../metadata/android/pt/full_description.txt | 18 ++++++++++++++++++ .../metadata/android/pt/short_description.txt | 1 + fastlane/metadata/android/pt/title.txt | 1 + .../metadata/android/ru/full_description.txt | 18 ++++++++++++++++++ .../metadata/android/ru/short_description.txt | 1 + fastlane/metadata/android/ru/title.txt | 1 + 6 files changed, 40 insertions(+) create mode 100644 fastlane/metadata/android/pt/full_description.txt create mode 100644 fastlane/metadata/android/pt/short_description.txt create mode 100644 fastlane/metadata/android/pt/title.txt create mode 100644 fastlane/metadata/android/ru/full_description.txt create mode 100644 fastlane/metadata/android/ru/short_description.txt create mode 100644 fastlane/metadata/android/ru/title.txt diff --git a/fastlane/metadata/android/pt/full_description.txt b/fastlane/metadata/android/pt/full_description.txt new file mode 100644 index 00000000..9f3741ff --- /dev/null +++ b/fastlane/metadata/android/pt/full_description.txt @@ -0,0 +1,18 @@ +Uma excelente forma para manter o contacto com os seus amigos e familiares. Também pode ser utilizada para mensagens de grupo e possibilita bloqueio de números de telefone em versões Android 7+. + +Permite a utilização de vários formatos de data. Também pode alternar o formato das horas. + +É uma aplicação pequena - comparada com as aplicações do mesmo género - o que torna a sua descarga muito rápida. + +Disponibiliza um design atrativo e um tema escuro por omissão. A não utilização da permissão Internet providencia-lhe mais privacidade, segurança e estabilidade do que as outras aplicações. + +Não contém anúncios nem permissões desnecessárias. É open source e permite a personalização de cores. + +Consulte o conjunto completo de aplicações Simple aqui: +https://www.simplemobiletools.com + +Facebook: +https://www.facebook.com/simplemobiletools + +Reddit: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/pt/short_description.txt b/fastlane/metadata/android/pt/short_description.txt new file mode 100644 index 00000000..4eadd656 --- /dev/null +++ b/fastlane/metadata/android/pt/short_description.txt @@ -0,0 +1 @@ +Aplicação simples para gerir SMS e MMS, sem anúncios. diff --git a/fastlane/metadata/android/pt/title.txt b/fastlane/metadata/android/pt/title.txt new file mode 100644 index 00000000..9aabacf2 --- /dev/null +++ b/fastlane/metadata/android/pt/title.txt @@ -0,0 +1 @@ +Simple SMS Messenger - Gestão de mensagens diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt new file mode 100644 index 00000000..3e48bb3d --- /dev/null +++ b/fastlane/metadata/android/ru/full_description.txt @@ -0,0 +1,18 @@ +SMS/MMS-сообщения — это отличный способ оставаться на связи со своими родственниками. Приложение также правильно обрабатывает групповые сообщения и блокировку номеров на Android 7+. + +Поддерживается множество вариантов отображения даты, чтобы вам было удобно пользоваться приложением. Также вы можете переключаться между 12- и 24-часовым форматом времени. + +Наше приложение имеет очень маленький размер по сравнению с конкурентами, что делает его загрузку такой быстрой. + +Приложение выпускается с материальным дизайном и тёмной темой по умолчанию, что обеспечивает удобное использование. Отсутствие доступа в интернет обеспечивает вам больше приватности, безопасности и стабильности, чем в других приложениях. + +Не содержит рекламы или ненужных разрешений. Полностью открытый исходный код, есть возможность настроить цвета интерфейса. + +Ознакомьтесь с полным набором инструментов серии Simple здесь: +https://www.simplemobiletools.com + +Facebook: +https://www.facebook.com/simplemobiletools + +Reddit: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt new file mode 100644 index 00000000..9fd3c07e --- /dev/null +++ b/fastlane/metadata/android/ru/short_description.txt @@ -0,0 +1 @@ +Простой и быстрый способ управления сообщениями SMS и MMS без рекламы. diff --git a/fastlane/metadata/android/ru/title.txt b/fastlane/metadata/android/ru/title.txt new file mode 100644 index 00000000..90599b4b --- /dev/null +++ b/fastlane/metadata/android/ru/title.txt @@ -0,0 +1 @@ +Simple SMS Messenger - лёгкое управление SMS From d98c1abb96107a7c52881f6d47d3c3dd3e68eac0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 23:43:09 +0200 Subject: [PATCH 21/37] improve contact sorting at New Conversation, prefer names starting with letters --- .../activities/NewConversationActivity.kt | 6 +---- .../smsmessenger/extensions/Context.kt | 2 +- .../smsmessenger/models/Contact.kt | 23 ++++++++++++++++++- 3 files changed, 24 insertions(+), 7 deletions(-) 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 f6eb6fc6..76bb20a5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -163,11 +163,7 @@ class NewConversationActivity : SimpleActivity() { contacts_letter_fastscroller.setupWithRecyclerView(contacts_list, { position -> try { val name = contacts[position].name - var character = if (name.isNotEmpty()) name.substring(0, 1) else "" - if (!character.areLettersOnly()) { - character = "#" - } - + val character = if (name.isNotEmpty()) name.substring(0, 1) else "" FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault())) } catch (e: Exception) { FastScrollItemIndicator.Text("") diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index e62461c0..d5e8a2e5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -403,7 +403,7 @@ fun Context.getAvailableContacts(callback: (ArrayList) -> Unit) { it.phoneNumber.substring(startIndex) }.toMutableList() as ArrayList - allContacts.sortBy { it.name.normalizeString().toLowerCase(Locale.getDefault()) } + allContacts.sort() callback(allContacts) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt index a5c186c5..a467254f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt @@ -1,3 +1,24 @@ package com.simplemobiletools.smsmessenger.models -data class Contact(val id: Int, var name: String, var photoUri: String, var phoneNumber: String) +import com.simplemobiletools.commons.extensions.normalizeString + +data class Contact(val id: Int, var name: String, var photoUri: String, var phoneNumber: String) : Comparable { + override fun compareTo(other: Contact): Int { + val firstString = name.normalizeString() + val secondString = other.name.normalizeString() + + return if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) { + -1 + } else if (firstString.firstOrNull()?.isLetter() == false && secondString.firstOrNull()?.isLetter() == true) { + 1 + } else { + if (firstString.isEmpty() && secondString.isNotEmpty()) { + 1 + } else if (firstString.isNotEmpty() && secondString.isEmpty()) { + -1 + } else { + firstString.compareTo(secondString, true) + } + } + } +} From a2d088d3fee8348d340966e1c25225ca63ac97d4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 23:46:11 +0200 Subject: [PATCH 22/37] update version to 5.1.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ced4e627..41d9ba80 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 29 - versionCode 2 - versionName "5.0.1" + versionCode 3 + versionName "5.1.0" setProperty("archivesBaseName", "sms-messenger") } From f521b0fe032b5e160742ce2e8a5c218a2d2553fc Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 3 May 2020 23:46:17 +0200 Subject: [PATCH 23/37] updating changelog --- CHANGELOG.md | 8 ++++++++ fastlane/metadata/android/en-US/changelogs/3.txt | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/3.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 01ad5fd0..d3387c0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========== +Version 5.1.0 *(2020-05-03)* +---------------------------- + + * Adding multi-SIM support + * Properly show the latest messages, not the oldest ones in some cases + * Increased minimal OS version to Android 5.1 + * Fixed many other UI and UX related issues + Version 5.0.1 *(2020-04-19)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/3.txt b/fastlane/metadata/android/en-US/changelogs/3.txt new file mode 100644 index 00000000..080fbc15 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3.txt @@ -0,0 +1,4 @@ + * Adding multi-SIM support + * Properly show the latest messages, not the oldest ones in some cases + * Increased minimal OS version to Android 5.1 + * Fixed many other UI and UX related issues From c17d78b8713e817f5678ac509616ea7ab5cb9490 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 6 May 2020 21:35:52 +0200 Subject: [PATCH 24/37] allow moving the app on an SD card --- app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d8073b3d..c2f17766 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ + package="com.simplemobiletools.smsmessenger" + android:installLocation="auto"> From 605f9e845ad233d617ef27047af91e433f8ab6cd Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 6 May 2020 23:41:12 +0200 Subject: [PATCH 25/37] moving some contact related things into Commons --- app/build.gradle | 2 +- .../activities/NewConversationActivity.kt | 20 +-- .../smsmessenger/activities/ThreadActivity.kt | 14 +- .../adapters/AutoCompleteTextViewAdapter.kt | 10 +- .../smsmessenger/adapters/ContactsAdapter.kt | 6 +- .../smsmessenger/extensions/ArrayList.kt | 4 +- .../smsmessenger/extensions/Context.kt | 127 ++---------------- .../smsmessenger/models/Contact.kt | 24 ---- .../smsmessenger/models/Message.kt | 3 +- 9 files changed, 44 insertions(+), 166 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt diff --git a/app/build.gradle b/app/build.gradle index 41d9ba80..8e6e8c7e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.2' + implementation 'com.simplemobiletools:commons:5.27.10' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' 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 76bb20a5..f3890054 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -7,13 +7,17 @@ import android.view.Menu import android.view.WindowManager import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.ContactsAdapter -import com.simplemobiletools.smsmessenger.extensions.* +import com.simplemobiletools.smsmessenger.extensions.config +import com.simplemobiletools.smsmessenger.extensions.getSuggestedContacts +import com.simplemobiletools.smsmessenger.extensions.getThreadId +import com.simplemobiletools.smsmessenger.extensions.loadImage import com.simplemobiletools.smsmessenger.helpers.* -import com.simplemobiletools.smsmessenger.models.Contact import kotlinx.android.synthetic.main.activity_conversation.* import kotlinx.android.synthetic.main.item_suggested_contact.view.* import java.net.URLDecoder @@ -21,7 +25,7 @@ import java.util.* import kotlin.collections.ArrayList class NewConversationActivity : SimpleActivity() { - private var allContacts = ArrayList() + private var allContacts = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -57,7 +61,7 @@ class NewConversationActivity : SimpleActivity() { fetchContacts() new_conversation_address.onTextChangeListener { val searchString = it - val filteredContacts = ArrayList() + val filteredContacts = ArrayList() allContacts.forEach { if (it.phoneNumber.contains(searchString, true) || it.name.contains(searchString, true)) { filteredContacts.add(it) @@ -100,7 +104,7 @@ class NewConversationActivity : SimpleActivity() { private fun fetchContacts() { fillSuggestedContacts { - getAvailableContacts { + ContactsHelper(this).getAvailableContacts { allContacts = it runOnUiThread { @@ -110,7 +114,7 @@ class NewConversationActivity : SimpleActivity() { } } - private fun setupAdapter(contacts: ArrayList) { + private fun setupAdapter(contacts: ArrayList) { val hasContacts = contacts.isNotEmpty() contacts_list.beVisibleIf(hasContacts) no_contacts_placeholder.beVisibleIf(!hasContacts) @@ -123,7 +127,7 @@ class NewConversationActivity : SimpleActivity() { ContactsAdapter(this, contacts, contacts_list, null) { hideKeyboard() - launchThreadActivity((it as Contact).phoneNumber, it.name) + launchThreadActivity((it as SimpleContact).phoneNumber, it.name) }.apply { contacts_list.adapter = this } @@ -159,7 +163,7 @@ class NewConversationActivity : SimpleActivity() { } } - private fun setupLetterFastscroller(contacts: ArrayList) { + private fun setupLetterFastscroller(contacts: ArrayList) { contacts_letter_fastscroller.setupWithRecyclerView(contacts_list, { position -> try { val name = contacts[position].name 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 de0a80c7..8202de0a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -30,9 +30,11 @@ import com.klinker.android.send_message.Settings import com.klinker.android.send_message.Transaction import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.isNougatPlus +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter @@ -54,7 +56,7 @@ class ThreadActivity : SimpleActivity() { private var currentSIMCardIndex = 0 private var threadItems = ArrayList() private var bus: EventBus? = null - private var participants = ArrayList() + private var participants = ArrayList() private var messages = ArrayList() private val availableSIMCards = ArrayList() private var attachmentUris = LinkedHashSet() @@ -104,7 +106,7 @@ class ThreadActivity : SimpleActivity() { return@ensureBackgroundThread } - val contact = Contact(0, name, "", number) + val contact = SimpleContact(0, name, "", number) participants.add(contact) } @@ -200,7 +202,7 @@ class ThreadActivity : SimpleActivity() { thread_messages_list.adapter = adapter } - getAvailableContacts { + ContactsHelper(this).getAvailableContacts { runOnUiThread { val adapter = AutoCompleteTextViewAdapter(this, it) add_contact_or_number.setAdapter(adapter) @@ -219,7 +221,7 @@ class ThreadActivity : SimpleActivity() { confirm_inserted_number.setOnClickListener { val number = add_contact_or_number.value - val contact = Contact(number.hashCode(), number, "", number) + val contact = SimpleContact(number.hashCode(), number, "", number) addSelectedContact(contact) } } @@ -358,7 +360,7 @@ class ThreadActivity : SimpleActivity() { showSelectedContact(views) } - private fun addSelectedContact(contact: Contact) { + private fun addSelectedContact(contact: SimpleContact) { add_contact_or_number.setText("") if (participants.map { it.id }.contains(contact.id)) { return @@ -555,7 +557,7 @@ class ThreadActivity : SimpleActivity() { } private fun removeSelectedContact(id: Int) { - participants = participants.filter { it.id != id }.toMutableList() as ArrayList + participants = participants.filter { it.id != id }.toMutableList() as ArrayList showSelectedContacts() } 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 ff02fbc8..c7d7b913 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -6,15 +6,15 @@ import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.Filter import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.loadImage -import com.simplemobiletools.smsmessenger.models.Contact import kotlinx.android.synthetic.main.item_contact.view.* -class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : - ArrayAdapter(activity, 0, contacts) { - var resultList = ArrayList() +class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : + ArrayAdapter(activity, 0, contacts) { + var resultList = ArrayList() override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val contact = resultList[position] @@ -62,7 +62,7 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar } } - override fun convertResultToString(resultValue: Any?) = (resultValue as? Contact)?.name + override fun convertResultToString(resultValue: Any?) = (resultValue as? SimpleContact)?.name } override fun getItem(index: Int) = resultList[index] diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt index a7b87bff..b496c3d1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -5,17 +5,17 @@ import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.loadImage -import com.simplemobiletools.smsmessenger.models.Contact import kotlinx.android.synthetic.main.item_contact_with_number.view.* import java.util.* class ContactsAdapter( - activity: SimpleActivity, var contacts: ArrayList, recyclerView: MyRecyclerView, + activity: SimpleActivity, var contacts: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller?, itemClick: (Any) -> Unit ) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { @@ -57,7 +57,7 @@ class ContactsAdapter( } } - private fun setupView(view: View, contact: Contact) { + private fun setupView(view: View, contact: SimpleContact) { view.apply { contact_name.text = contact.name contact_name.setTextColor(textColor) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt index 6e71dd87..dfaf3202 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt @@ -1,6 +1,6 @@ package com.simplemobiletools.smsmessenger.extensions import android.text.TextUtils -import com.simplemobiletools.smsmessenger.models.Contact +import com.simplemobiletools.commons.models.SimpleContact -fun ArrayList.getThreadTitle() = TextUtils.join(", ", map { it.name }.toTypedArray()) +fun ArrayList.getThreadTitle() = TextUtils.join(", ", map { it.name }.toTypedArray()) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index d5e8a2e5..350ecc0e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -15,10 +15,6 @@ import android.media.AudioAttributes import android.media.AudioManager import android.media.RingtoneManager import android.net.Uri -import android.provider.ContactsContract -import android.provider.ContactsContract.CommonDataKinds -import android.provider.ContactsContract.CommonDataKinds.Organization -import android.provider.ContactsContract.CommonDataKinds.StructuredName import android.provider.ContactsContract.PhoneLookup import android.provider.Telephony.* import android.text.TextUtils @@ -30,6 +26,7 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.ThreadActivity import com.simplemobiletools.smsmessenger.helpers.Config @@ -72,7 +69,7 @@ fun Context.getMessages(threadId: Int): ArrayList { val date = (cursor.getLongValue(Sms.DATE) / 1000).toInt() val read = cursor.getIntValue(Sms.READ) == 1 val thread = cursor.getIntValue(Sms.THREAD_ID) - val participant = Contact(0, senderName, photoUri, senderNumber) + val participant = SimpleContact(0, senderName, photoUri, senderNumber) val isMMS = false val message = Message(id, body, type, arrayListOf(participant), date, read, thread, isMMS, null, senderName, photoUri) messages.add(message) @@ -109,7 +106,7 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< } val messages = ArrayList() - val contactsMap = HashMap() + val contactsMap = HashMap() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val mmsId = cursor.getIntValue(Mms._ID) val type = cursor.getIntValue(Mms.MESSAGE_BOX) @@ -196,7 +193,7 @@ fun Context.getConversations(): ArrayList { val names = getThreadContactNames(phoneNumbers) val title = TextUtils.join(", ", names.toTypedArray()) - val photoUri = if (phoneNumbers.size == 1) getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" + val photoUri = if (phoneNumbers.size == 1) ContactsHelper(this).getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" val isGroupConversation = phoneNumbers.size > 1 val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation) conversations.add(conversation) @@ -279,14 +276,14 @@ fun Context.getThreadSnippet(threadId: Int): String { return snippet } -fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap?): ArrayList { +fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap?): ArrayList { val uri = Uri.parse("${MmsSms.CONTENT_CONVERSATIONS_URI}?simple=true") val projection = arrayOf( ThreadsColumns.RECIPIENT_IDS ) val selection = "${Mms._ID} = ?" val selectionArgs = arrayOf(threadId.toString()) - val participants = ArrayList() + val participants = ArrayList() try { val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) cursor?.use { @@ -303,7 +300,7 @@ fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap): ArrayList { fun Context.getThreadContactNames(phoneNumbers: List): ArrayList { val names = ArrayList() phoneNumbers.forEach { - names.add(getNameFromPhoneNumber(it)) + names.add(ContactsHelper(this).getNameFromPhoneNumber(it)) } return names } @@ -351,8 +348,8 @@ fun Context.getPhoneNumberFromAddressId(canonicalAddressId: Int): String { return "" } -fun Context.getSuggestedContacts(): ArrayList { - val contacts = ArrayList() +fun Context.getSuggestedContacts(): ArrayList { + val contacts = ArrayList() val uri = Sms.CONTENT_URI val projection = arrayOf( Sms.ADDRESS @@ -371,7 +368,7 @@ fun Context.getSuggestedContacts(): ArrayList { val senderName = namePhoto.name val photoUri = namePhoto.photoUri ?: "" - val contact = Contact(0, senderName, photoUri, senderNumber) + val contact = SimpleContact(0, senderName, photoUri, senderNumber) if (!contacts.map { it.phoneNumber.trimToComparableNumber() }.contains(senderNumber.trimToComparableNumber())) { contacts.add(contact) } @@ -380,34 +377,6 @@ fun Context.getSuggestedContacts(): ArrayList { return contacts } -fun Context.getAvailableContacts(callback: (ArrayList) -> Unit) { - ensureBackgroundThread { - val names = getContactNames() - var allContacts = getContactPhoneNumbers() - allContacts.forEach { - val contactId = it.id - val contact = names.firstOrNull { it.id == contactId } - val name = contact?.name - if (name != null) { - it.name = name - } - - val photoUri = contact?.photoUri - if (photoUri != null) { - it.photoUri = photoUri - } - } - - allContacts = allContacts.filter { it.name.isNotEmpty() }.distinctBy { - val startIndex = Math.max(0, it.phoneNumber.length - 9) - it.phoneNumber.substring(startIndex) - }.toMutableList() as ArrayList - - allContacts.sort() - callback(allContacts) - } -} - fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto? { if (!hasPermission(PERMISSION_READ_CONTACTS)) { return NamePhoto(number, null) @@ -435,80 +404,6 @@ fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto? { return NamePhoto(number, null) } -fun Context.getContactNames(): List { - val contacts = ArrayList() - val uri = ContactsContract.Data.CONTENT_URI - val projection = arrayOf( - ContactsContract.Data.CONTACT_ID, - StructuredName.PREFIX, - StructuredName.GIVEN_NAME, - StructuredName.MIDDLE_NAME, - StructuredName.FAMILY_NAME, - StructuredName.SUFFIX, - StructuredName.PHOTO_THUMBNAIL_URI, - Organization.COMPANY, - Organization.TITLE, - ContactsContract.Data.MIMETYPE - ) - - val selection = "${ContactsContract.Data.MIMETYPE} = ? OR ${ContactsContract.Data.MIMETYPE} = ?" - val selectionArgs = arrayOf( - StructuredName.CONTENT_ITEM_TYPE, - Organization.CONTENT_ITEM_TYPE - ) - - queryCursor(uri, projection, selection, selectionArgs) { cursor -> - val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) - val mimetype = cursor.getStringValue(ContactsContract.Data.MIMETYPE) - val photoUri = cursor.getStringValue(StructuredName.PHOTO_THUMBNAIL_URI) ?: "" - val isPerson = mimetype == StructuredName.CONTENT_ITEM_TYPE - if (isPerson) { - val prefix = cursor.getStringValue(StructuredName.PREFIX) ?: "" - val firstName = cursor.getStringValue(StructuredName.GIVEN_NAME) ?: "" - val middleName = cursor.getStringValue(StructuredName.MIDDLE_NAME) ?: "" - val familyName = cursor.getStringValue(StructuredName.FAMILY_NAME) ?: "" - val suffix = cursor.getStringValue(StructuredName.SUFFIX) ?: "" - if (firstName.isNotEmpty() || middleName.isNotEmpty() || familyName.isNotEmpty()) { - val names = arrayOf(prefix, firstName, middleName, familyName, suffix).filter { it.isNotEmpty() } - val fullName = TextUtils.join(" ", names) - val contact = Contact(id, fullName, photoUri, "") - contacts.add(contact) - } - } - - val isOrganization = mimetype == Organization.CONTENT_ITEM_TYPE - if (isOrganization) { - val company = cursor.getStringValue(Organization.COMPANY) ?: "" - val jobTitle = cursor.getStringValue(Organization.TITLE) ?: "" - if (company.isNotEmpty() || jobTitle.isNotEmpty()) { - val fullName = "$company $jobTitle".trim() - val contact = Contact(id, fullName, photoUri, "") - contacts.add(contact) - } - } - } - return contacts -} - -fun Context.getContactPhoneNumbers(): ArrayList { - val contacts = ArrayList() - val uri = CommonDataKinds.Phone.CONTENT_URI - val projection = arrayOf( - ContactsContract.Data.CONTACT_ID, - CommonDataKinds.Phone.NORMALIZED_NUMBER - ) - - queryCursor(uri, projection) { cursor -> - val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) - val phoneNumber = cursor.getStringValue(CommonDataKinds.Phone.NORMALIZED_NUMBER) - if (phoneNumber != null) { - val contact = Contact(id, "", "", phoneNumber) - contacts.add(contact) - } - } - return contacts -} - fun Context.insertNewSMS(address: String, subject: String, body: String, date: Long, read: Int, threadId: Long, type: Int) { val uri = Sms.CONTENT_URI val contentValues = ContentValues().apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt deleted file mode 100644 index a467254f..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.simplemobiletools.smsmessenger.models - -import com.simplemobiletools.commons.extensions.normalizeString - -data class Contact(val id: Int, var name: String, var photoUri: String, var phoneNumber: String) : Comparable { - override fun compareTo(other: Contact): Int { - val firstString = name.normalizeString() - val secondString = other.name.normalizeString() - - return if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) { - -1 - } else if (firstString.firstOrNull()?.isLetter() == false && secondString.firstOrNull()?.isLetter() == true) { - 1 - } else { - if (firstString.isEmpty() && secondString.isNotEmpty()) { - 1 - } else if (firstString.isNotEmpty() && secondString.isEmpty()) { - -1 - } else { - firstString.compareTo(secondString, true) - } - } - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt index 0b9f797f..031ae426 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt @@ -1,9 +1,10 @@ package com.simplemobiletools.smsmessenger.models import android.provider.Telephony +import com.simplemobiletools.commons.models.SimpleContact data class Message( - val id: Int, val body: String, val type: Int, val participants: ArrayList, val date: Int, val read: Boolean, val thread: Int, + val id: Int, val body: String, val type: Int, val participants: ArrayList, val date: Int, val read: Boolean, val thread: Int, val isMMS: Boolean, val attachment: MessageAttachment?, val senderName: String, val senderPhotoUri: String ) : ThreadItem() { fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX From bea48aff138ab26dfd00ed9c27edfc551df5f48f Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 7 May 2020 15:20:40 +0200 Subject: [PATCH 26/37] moving some contact display related things into Commons --- app/build.gradle | 3 +- .../adapters/AutoCompleteTextViewAdapter.kt | 8 +-- .../smsmessenger/adapters/ContactsAdapter.kt | 15 ++--- .../smsmessenger/models/Message.kt | 3 +- app/src/main/res/layout/item_contact.xml | 57 ------------------- .../res/layout/item_contact_with_number.xml | 43 -------------- .../main/res/layout/item_received_message.xml | 4 +- app/src/main/res/values/dimens.xml | 1 - 8 files changed, 16 insertions(+), 118 deletions(-) delete mode 100644 app/src/main/res/layout/item_contact.xml delete mode 100644 app/src/main/res/layout/item_contact_with_number.xml diff --git a/app/build.gradle b/app/build.gradle index 8e6e8c7e..e9a22fb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,8 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.10' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' + implementation 'com.simplemobiletools:commons:5.27.11' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' 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 c7d7b913..f87730e8 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,12 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.Filter +import android.widget.TextView import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.loadImage -import kotlinx.android.synthetic.main.item_contact.view.* class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { @@ -25,10 +25,10 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar listItem!!.apply { tag = contact.name.isNotEmpty() - item_autocomplete_name.text = contact.name - item_autocomplete_number.text = contact.phoneNumber + findViewById(R.id.item_contact_name).text = contact.name + findViewById(R.id.item_contact_number).text = contact.phoneNumber - context.loadImage(contact.photoUri, item_autocomplete_image, contact.name) + context.loadImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) } return listItem diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt index b496c3d1..fe09ad15 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -3,6 +3,8 @@ package com.simplemobiletools.smsmessenger.adapters import android.view.Menu import android.view.View import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.models.SimpleContact @@ -11,7 +13,6 @@ import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.loadImage -import kotlinx.android.synthetic.main.item_contact_with_number.view.* import java.util.* class ContactsAdapter( @@ -53,19 +54,19 @@ class ContactsAdapter( override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) if (!activity.isDestroyed && !activity.isFinishing) { - Glide.with(activity).clear(holder.itemView.contact_tmb) + Glide.with(activity).clear(holder.itemView.findViewById(R.id.item_contact_tmb)) } } private fun setupView(view: View, contact: SimpleContact) { view.apply { - contact_name.text = contact.name - contact_name.setTextColor(textColor) + findViewById(R.id.item_contact_name).text = contact.name + findViewById(R.id.item_contact_name).setTextColor(textColor) - contact_number.text = contact.phoneNumber - contact_number.setTextColor(textColor) + findViewById(R.id.item_contact_number).text = contact.phoneNumber + findViewById(R.id.item_contact_number).setTextColor(textColor) - context.loadImage(contact.photoUri, contact_tmb, contact.name) + context.loadImage(contact.photoUri, findViewById(R.id.item_contact_tmb), contact.name) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt index 031ae426..2b6f24c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt @@ -5,7 +5,6 @@ import com.simplemobiletools.commons.models.SimpleContact data class Message( val id: Int, val body: String, val type: Int, val participants: ArrayList, val date: Int, val read: Boolean, val thread: Int, - val isMMS: Boolean, val attachment: MessageAttachment?, val senderName: String, val senderPhotoUri: String -) : ThreadItem() { + val isMMS: Boolean, val attachment: MessageAttachment?, val senderName: String, val senderPhotoUri: String) : ThreadItem() { fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX } diff --git a/app/src/main/res/layout/item_contact.xml b/app/src/main/res/layout/item_contact.xml deleted file mode 100644 index eb3333f4..00000000 --- a/app/src/main/res/layout/item_contact.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/item_contact_with_number.xml b/app/src/main/res/layout/item_contact_with_number.xml deleted file mode 100644 index aae30363..00000000 --- a/app/src/main/res/layout/item_contact_with_number.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/item_received_message.xml b/app/src/main/res/layout/item_received_message.xml index 60c96090..7ea3c0ed 100644 --- a/app/src/main/res/layout/item_received_message.xml +++ b/app/src/main/res/layout/item_received_message.xml @@ -22,8 +22,8 @@ 72dp - 40dp 64dp 36dp 60dp From 663413032551eecff869a8caeb8271752e5106a7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 7 May 2020 15:51:23 +0200 Subject: [PATCH 27/37] moving some contact handling related things in Commons --- app/build.gradle | 2 +- .../activities/NewConversationActivity.kt | 3 +-- .../adapters/AutoCompleteTextViewAdapter.kt | 4 +-- .../smsmessenger/adapters/ContactsAdapter.kt | 4 +-- .../adapters/ConversationsAdapter.kt | 7 +++-- .../smsmessenger/adapters/ThreadAdapter.kt | 4 +-- .../smsmessenger/extensions/Context.kt | 26 +------------------ 7 files changed, 12 insertions(+), 38 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e9a22fb2..d8153f6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.11' + implementation 'com.simplemobiletools:commons:5.27.12' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' 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 f3890054..aa399cb2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -16,7 +16,6 @@ import com.simplemobiletools.smsmessenger.adapters.ContactsAdapter import com.simplemobiletools.smsmessenger.extensions.config import com.simplemobiletools.smsmessenger.extensions.getSuggestedContacts import com.simplemobiletools.smsmessenger.extensions.getThreadId -import com.simplemobiletools.smsmessenger.extensions.loadImage import com.simplemobiletools.smsmessenger.helpers.* import kotlinx.android.synthetic.main.activity_conversation.* import kotlinx.android.synthetic.main.item_suggested_contact.view.* @@ -150,7 +149,7 @@ class NewConversationActivity : SimpleActivity() { val contact = it layoutInflater.inflate(R.layout.item_suggested_contact, null).apply { suggested_contact_name.text = contact.name - loadImage(contact.photoUri, suggested_contact_image, contact.name) + ContactsHelper(this@NewConversationActivity).loadContactImage(contact.photoUri, suggested_contact_image, contact.name) suggestions_holder.addView(this) setOnClickListener { launchThreadActivity(contact.phoneNumber, contact.name) 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 f87730e8..85f61852 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -7,10 +7,10 @@ import android.widget.ArrayAdapter import android.widget.Filter import android.widget.TextView import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity -import com.simplemobiletools.smsmessenger.extensions.loadImage class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { @@ -28,7 +28,7 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar findViewById(R.id.item_contact_name).text = contact.name findViewById(R.id.item_contact_number).text = contact.phoneNumber - context.loadImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) + ContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) } return listItem diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt index fe09ad15..73e21c43 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -7,12 +7,12 @@ import android.widget.ImageView import android.widget.TextView import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity -import com.simplemobiletools.smsmessenger.extensions.loadImage import java.util.* class ContactsAdapter( @@ -66,7 +66,7 @@ class ContactsAdapter( findViewById(R.id.item_contact_number).text = contact.phoneNumber findViewById(R.id.item_contact_number).setTextColor(textColor) - context.loadImage(contact.photoUri, findViewById(R.id.item_contact_tmb), contact.name) + ContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_tmb), 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 d33aee50..af580930 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -9,14 +9,13 @@ import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.formatDateOrTime -import com.simplemobiletools.commons.extensions.getColoredGroupIcon +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.deleteConversation -import com.simplemobiletools.smsmessenger.extensions.loadImage import com.simplemobiletools.smsmessenger.helpers.refreshMessages import com.simplemobiletools.smsmessenger.models.Conversation import kotlinx.android.synthetic.main.item_conversation.view.* @@ -141,12 +140,12 @@ class ConversationsAdapter( // at group conversations we use an icon as the placeholder, not any letter val placeholder = if (conversation.isGroupConversation) { - activity.getColoredGroupIcon(conversation.title) + ContactsHelper(context).getColoredGroupIcon(conversation.title) } else { null } - context.loadImage(conversation.photoUri, conversation_image, conversation.title, placeholder) + ContactsHelper(context).loadContactImage(conversation.photoUri, conversation_image, conversation.title, placeholder) } } } 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 ad7443ff..648c8e28 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -20,13 +20,13 @@ import com.bumptech.glide.request.target.Target import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.deleteMessage -import com.simplemobiletools.smsmessenger.extensions.loadImage import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.Message import com.simplemobiletools.smsmessenger.models.ThreadDateTime @@ -186,7 +186,7 @@ class ThreadAdapter( if (message.isReceivedMessage()) { thread_message_sender_photo.beVisible() thread_message_body.setTextColor(textColor) - context.loadImage(message.senderPhotoUri, thread_message_sender_photo, message.senderName) + ContactsHelper(context).loadContactImage(message.senderPhotoUri, thread_message_sender_photo, message.senderName) } else { thread_message_sender_photo?.beGone() val background = context.getAdjustedPrimaryColor() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 350ecc0e..7a256c45 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -9,8 +9,6 @@ import android.content.ContentValues import android.content.Context import android.content.Intent import android.graphics.Bitmap -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable import android.media.AudioAttributes import android.media.AudioManager import android.media.RingtoneManager @@ -18,12 +16,7 @@ import android.net.Uri import android.provider.ContactsContract.PhoneLookup import android.provider.Telephony.* import android.text.TextUtils -import android.widget.ImageView import androidx.core.app.NotificationCompat -import com.bumptech.glide.Glide -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import com.bumptech.glide.request.RequestOptions import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.SimpleContact @@ -506,7 +499,7 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa val summaryText = getString(R.string.new_message) val sender = getNameAndPhotoFromPhoneNumber(address)?.name ?: "" - val largeIcon = bitmap ?: getContactLetterIcon(sender) + val largeIcon = bitmap ?: ContactsHelper(this).getContactLetterIcon(sender) val builder = NotificationCompat.Builder(this, channelId) .setContentTitle(sender) .setContentText(body) @@ -523,20 +516,3 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa notificationManager.notify(threadID, builder.build()) } - -fun Context.loadImage(path: String, imageView: ImageView, placeholderName: String, placeholderImage: Drawable? = null) { - val placeholder = placeholderImage ?: BitmapDrawable(resources, getContactLetterIcon(placeholderName)) - - val options = RequestOptions() - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - .error(placeholder) - .centerCrop() - - Glide.with(this) - .load(path) - .transition(DrawableTransitionOptions.withCrossFade()) - .placeholder(placeholder) - .apply(options) - .apply(RequestOptions.circleCropTransform()) - .into(imageView) -} From 5206b436770295bc2e497fcfe083abadb13c66dd Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 7 May 2020 15:54:58 +0200 Subject: [PATCH 28/37] formatting some adapter code style --- .../smsmessenger/adapters/AutoCompleteTextViewAdapter.kt | 4 ++-- .../smsmessenger/adapters/ContactsAdapter.kt | 7 ++----- .../smsmessenger/adapters/ConversationsAdapter.kt | 8 ++------ .../smsmessenger/adapters/ThreadAdapter.kt | 8 ++------ 4 files changed, 8 insertions(+), 19 deletions(-) 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 85f61852..c052043f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -12,8 +12,8 @@ import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity -class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : - ArrayAdapter(activity, 0, contacts) { +class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { + var resultList = ArrayList() override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt index 73e21c43..e32074b1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -15,11 +15,8 @@ import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import java.util.* -class ContactsAdapter( - activity: SimpleActivity, var contacts: ArrayList, recyclerView: MyRecyclerView, - fastScroller: FastScroller?, itemClick: (Any) -> Unit -) : - MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { +class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller?, + itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { override fun getActionMenuId() = 0 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 af580930..d12395c8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -20,12 +20,8 @@ import com.simplemobiletools.smsmessenger.helpers.refreshMessages import com.simplemobiletools.smsmessenger.models.Conversation import kotlinx.android.synthetic.main.item_conversation.view.* -class ConversationsAdapter( - activity: SimpleActivity, var conversations: ArrayList, - recyclerView: MyRecyclerView, - fastScroller: FastScroller, - itemClick: (Any) -> Unit -) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { +class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller, + itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { init { setupDragListener(true) 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 648c8e28..da3b831c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -38,12 +38,8 @@ import kotlinx.android.synthetic.main.item_received_unknown_attachment.view.* import kotlinx.android.synthetic.main.item_sent_unknown_attachment.view.* import kotlinx.android.synthetic.main.item_thread_date_time.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() From 9c5255701b590e3648464017694d5c5c808623ad Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 8 May 2020 10:27:16 +0200 Subject: [PATCH 29/37] updating commons with some details --- app/build.gradle | 2 +- .../smsmessenger/adapters/AutoCompleteTextViewAdapter.kt | 2 +- .../smsmessenger/adapters/ContactsAdapter.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d8153f6a..9fd846bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.12' + implementation 'com.simplemobiletools:commons:5.27.13' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' 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 c052043f..2f988811 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -20,7 +20,7 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar val contact = resultList[position] var listItem = convertView if (listItem == null || listItem.tag != contact.name.isNotEmpty()) { - listItem = LayoutInflater.from(activity).inflate(R.layout.item_contact, parent, false) + listItem = LayoutInflater.from(activity).inflate(R.layout.item_contact_with_number, parent, false) } listItem!!.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt index e32074b1..36e5195f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -51,7 +51,7 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList(R.id.item_contact_tmb)) + Glide.with(activity).clear(holder.itemView.findViewById(R.id.item_contact_image)) } } @@ -63,7 +63,7 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList(R.id.item_contact_number).text = contact.phoneNumber findViewById(R.id.item_contact_number).setTextColor(textColor) - ContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_tmb), contact.name) + ContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) } } } From f1edebb2dce6a493d7a8ee63f5a2de070e597d93 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 8 May 2020 22:37:51 +0200 Subject: [PATCH 30/37] renaming the helper class ContactsHelper to SimpleContactsHelper --- app/build.gradle | 2 +- .../activities/NewConversationActivity.kt | 6 +++--- .../smsmessenger/activities/ThreadActivity.kt | 18 +++++++++--------- .../adapters/AutoCompleteTextViewAdapter.kt | 4 ++-- .../smsmessenger/adapters/ContactsAdapter.kt | 8 ++++---- .../adapters/ConversationsAdapter.kt | 6 +++--- .../smsmessenger/adapters/ThreadAdapter.kt | 4 ++-- .../smsmessenger/extensions/Context.kt | 14 +++++++------- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9fd846bf..080ae371 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.13' + implementation 'com.simplemobiletools:commons:5.27.18' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' 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 aa399cb2..fc07761c 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,8 @@ import android.view.Menu import android.view.WindowManager import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R @@ -103,7 +103,7 @@ class NewConversationActivity : SimpleActivity() { private fun fetchContacts() { fillSuggestedContacts { - ContactsHelper(this).getAvailableContacts { + SimpleContactsHelper(this).getAvailableContacts { allContacts = it runOnUiThread { @@ -149,7 +149,7 @@ class NewConversationActivity : SimpleActivity() { val contact = it layoutInflater.inflate(R.layout.item_suggested_contact, null).apply { suggested_contact_name.text = contact.name - ContactsHelper(this@NewConversationActivity).loadContactImage(contact.photoUri, suggested_contact_image, contact.name) + SimpleContactsHelper(this@NewConversationActivity).loadContactImage(contact.photoUri, suggested_contact_image, contact.name) suggestions_holder.addView(this) setOnClickListener { launchThreadActivity(contact.phoneNumber, contact.name) 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 8202de0a..163efec9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -30,8 +30,8 @@ import com.klinker.android.send_message.Settings import com.klinker.android.send_message.Transaction import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.models.SimpleContact @@ -106,7 +106,7 @@ class ThreadActivity : SimpleActivity() { return@ensureBackgroundThread } - val contact = SimpleContact(0, name, "", number) + val contact = SimpleContact(0, 0, name, "", number) participants.add(contact) } @@ -202,7 +202,7 @@ class ThreadActivity : SimpleActivity() { thread_messages_list.adapter = adapter } - ContactsHelper(this).getAvailableContacts { + SimpleContactsHelper(this).getAvailableContacts { runOnUiThread { val adapter = AutoCompleteTextViewAdapter(this, it) add_contact_or_number.setAdapter(adapter) @@ -221,7 +221,7 @@ class ThreadActivity : SimpleActivity() { confirm_inserted_number.setOnClickListener { val number = add_contact_or_number.value - val contact = SimpleContact(number.hashCode(), number, "", number) + val contact = SimpleContact(number.hashCode(), number.hashCode(), number, "", number) addSelectedContact(contact) } } @@ -278,7 +278,7 @@ class ThreadActivity : SimpleActivity() { if (availableSIMs.size > 1) { availableSIMs.forEachIndexed { index, subscriptionInfo -> var label = subscriptionInfo.displayName.toString() - if (subscriptionInfo.number.isNotEmpty()) { + if (subscriptionInfo.number?.isNotEmpty() == true) { label += " (${subscriptionInfo.number})" } val SIMCard = SIMCard(index + 1, subscriptionInfo.subscriptionId, label) @@ -350,8 +350,8 @@ class ThreadActivity : SimpleActivity() { layoutInflater.inflate(R.layout.item_selected_contact, null).apply { selected_contact_name.text = contact.name selected_contact_remove.setOnClickListener { - if (contact.id != participants.first().id) { - removeSelectedContact(contact.id) + if (contact.rawId != participants.first().rawId) { + removeSelectedContact(contact.rawId) } } views.add(this) @@ -362,7 +362,7 @@ class ThreadActivity : SimpleActivity() { private fun addSelectedContact(contact: SimpleContact) { add_contact_or_number.setText("") - if (participants.map { it.id }.contains(contact.id)) { + if (participants.map { it.rawId }.contains(contact.rawId)) { return } @@ -557,7 +557,7 @@ class ThreadActivity : SimpleActivity() { } private fun removeSelectedContact(id: Int) { - participants = participants.filter { it.id != id }.toMutableList() as ArrayList + participants = participants.filter { it.rawId != id }.toMutableList() as ArrayList showSelectedContacts() } 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 2f988811..75611076 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -7,7 +7,7 @@ import android.widget.ArrayAdapter import android.widget.Filter import android.widget.TextView import com.simplemobiletools.commons.extensions.normalizeString -import com.simplemobiletools.commons.helpers.ContactsHelper +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity @@ -28,7 +28,7 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar findViewById(R.id.item_contact_name).text = contact.name findViewById(R.id.item_contact_number).text = contact.phoneNumber - ContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) + SimpleContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) } return listItem diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt index 36e5195f..c08be665 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -7,7 +7,7 @@ import android.widget.ImageView import android.widget.TextView import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter -import com.simplemobiletools.commons.helpers.ContactsHelper +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -28,9 +28,9 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList(R.id.item_contact_number).text = contact.phoneNumber findViewById(R.id.item_contact_number).setTextColor(textColor) - ContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name) + 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 d12395c8..2677c10f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -9,7 +9,7 @@ import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.formatDateOrTime -import com.simplemobiletools.commons.helpers.ContactsHelper +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -136,12 +136,12 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis // at group conversations we use an icon as the placeholder, not any letter val placeholder = if (conversation.isGroupConversation) { - ContactsHelper(context).getColoredGroupIcon(conversation.title) + SimpleContactsHelper(context).getColoredGroupIcon(conversation.title) } else { null } - ContactsHelper(context).loadContactImage(conversation.photoUri, conversation_image, conversation.title, placeholder) + SimpleContactsHelper(context).loadContactImage(conversation.photoUri, conversation_image, conversation.title, placeholder) } } } 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 da3b831c..0a609b19 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -20,7 +20,7 @@ import com.bumptech.glide.request.target.Target import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.ContactsHelper +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -182,7 +182,7 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList { val date = (cursor.getLongValue(Sms.DATE) / 1000).toInt() val read = cursor.getIntValue(Sms.READ) == 1 val thread = cursor.getIntValue(Sms.THREAD_ID) - val participant = SimpleContact(0, senderName, photoUri, senderNumber) + val participant = SimpleContact(0, 0, senderName, photoUri, senderNumber) val isMMS = false val message = Message(id, body, type, arrayListOf(participant), date, read, thread, isMMS, null, senderName, photoUri) messages.add(message) @@ -126,7 +126,7 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< messages.add(message) participants.forEach { - contactsMap.put(it.id, it) + contactsMap.put(it.rawId, it) } } @@ -186,7 +186,7 @@ fun Context.getConversations(): ArrayList { val names = getThreadContactNames(phoneNumbers) val title = TextUtils.join(", ", names.toTypedArray()) - val photoUri = if (phoneNumbers.size == 1) ContactsHelper(this).getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" + val photoUri = if (phoneNumbers.size == 1) SimpleContactsHelper(this).getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" val isGroupConversation = phoneNumbers.size > 1 val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation) conversations.add(conversation) @@ -293,7 +293,7 @@ fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap): ArrayList { fun Context.getThreadContactNames(phoneNumbers: List): ArrayList { val names = ArrayList() phoneNumbers.forEach { - names.add(ContactsHelper(this).getNameFromPhoneNumber(it)) + names.add(SimpleContactsHelper(this).getNameFromPhoneNumber(it)) } return names } @@ -361,7 +361,7 @@ fun Context.getSuggestedContacts(): ArrayList { val senderName = namePhoto.name val photoUri = namePhoto.photoUri ?: "" - val contact = SimpleContact(0, senderName, photoUri, senderNumber) + val contact = SimpleContact(0, 0, senderName, photoUri, senderNumber) if (!contacts.map { it.phoneNumber.trimToComparableNumber() }.contains(senderNumber.trimToComparableNumber())) { contacts.add(contact) } @@ -499,7 +499,7 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa val summaryText = getString(R.string.new_message) val sender = getNameAndPhotoFromPhoneNumber(address)?.name ?: "" - val largeIcon = bitmap ?: ContactsHelper(this).getContactLetterIcon(sender) + val largeIcon = bitmap ?: SimpleContactsHelper(this).getContactLetterIcon(sender) val builder = NotificationCompat.Builder(this, channelId) .setContentTitle(sender) .setContentText(body) From ff0cc0b0055fd13a344edd4324ab802dc79eda37 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 8 May 2020 22:49:54 +0200 Subject: [PATCH 31/37] speed up SMS loading by caching blocked numbers --- .../smsmessenger/extensions/Context.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index df6c6f4e..97dd03ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -46,10 +46,20 @@ fun Context.getMessages(threadId: Int): ArrayList { val selectionArgs = arrayOf(threadId.toString()) val sortOrder = "${Sms._ID} DESC LIMIT 100" + val blockStatus = HashMap() var messages = ArrayList() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val senderNumber = cursor.getStringValue(Sms.ADDRESS) - if (isNumberBlocked(senderNumber)) { + + val isNumberBlocked = if (blockStatus.containsKey(senderNumber)) { + blockStatus[senderNumber] ?: false + } else { + val isBlocked = isNumberBlocked(senderNumber) + blockStatus[senderNumber] = isBlocked + isBlocked + } + + if (isNumberBlocked) { return@queryCursor } From d5af551001ba2c196ada970fe2bca5cf56f50d2b Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 8 May 2020 23:21:50 +0200 Subject: [PATCH 32/37] speed up MMS fetching by caching participants --- .../smsmessenger/extensions/Context.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 97dd03ba..8634f708 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -52,7 +52,7 @@ fun Context.getMessages(threadId: Int): ArrayList { val senderNumber = cursor.getStringValue(Sms.ADDRESS) val isNumberBlocked = if (blockStatus.containsKey(senderNumber)) { - blockStatus[senderNumber] ?: false + blockStatus[senderNumber]!! } else { val isBlocked = isNumberBlocked(senderNumber) blockStatus[senderNumber] = isBlocked @@ -85,7 +85,7 @@ fun Context.getMessages(threadId: Int): ArrayList { return messages } -// as soon as a message contains multiple recipients it count as an MMS instead of SMS +// as soon as a message contains multiple recipients it counts as an MMS instead of SMS fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList { val uri = Mms.CONTENT_URI val projection = arrayOf( @@ -110,13 +110,21 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< val messages = ArrayList() val contactsMap = HashMap() + val threadParticipants = HashMap>() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val mmsId = cursor.getIntValue(Mms._ID) val type = cursor.getIntValue(Mms.MESSAGE_BOX) val date = cursor.getLongValue(Mms.DATE).toInt() val read = cursor.getIntValue(Mms.READ) == 1 val threadId = cursor.getIntValue(Mms.THREAD_ID) - val participants = getThreadParticipants(threadId, contactsMap) + val participants = if (threadParticipants.containsKey(threadId)) { + threadParticipants[threadId]!! + } else { + val parts = getThreadParticipants(threadId, contactsMap) + threadParticipants[threadId] = parts + parts + } + val isMMS = true val attachment = getMmsAttachment(mmsId) val body = attachment?.text ?: "" From d31a3de39c0caea88b75cd0b8437e90c7daea0ac Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 8 May 2020 23:38:53 +0200 Subject: [PATCH 33/37] update version to 5.1.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 080ae371..181f4093 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 29 - versionCode 3 - versionName "5.1.0" + versionCode 4 + versionName "5.1.1" setProperty("archivesBaseName", "sms-messenger") } From c7bc8d2e2221c1974d977826942f3ad942e17b3f Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 8 May 2020 23:39:00 +0200 Subject: [PATCH 34/37] updating changelog --- CHANGELOG.md | 6 ++++++ fastlane/metadata/android/en-US/changelogs/4.txt | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/4.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index d3387c0f..0d621cc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 5.1.1 *(2020-05-08)* +---------------------------- + + * Allow moving the app on an SD card + * Added some performance, UI and stability improvements + Version 5.1.0 *(2020-05-03)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/4.txt b/fastlane/metadata/android/en-US/changelogs/4.txt new file mode 100644 index 00000000..7b45b5f5 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/4.txt @@ -0,0 +1,2 @@ + * Allow moving the app on an SD card + * Added some performance, UI and stability improvements From c9fcd135de02933e1cedc9bc9f6e9921f825dcc1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 9 May 2020 17:08:14 +0200 Subject: [PATCH 35/37] use proper resolutions for the launcher icon foregrounds --- .../mipmap-hdpi/ic_launcher_foreground.png | Bin 4228 -> 1955 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 4228 -> 1196 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 4228 -> 2516 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 4228 -> 4556 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 6652 -> 6287 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 9c6cfc62ed96709b50f658cfb96e2c0539651552..6d818eac2acb5f2e7b16b11c7ec14ca022baf62d 100644 GIT binary patch literal 1955 zcmbtV{Xf$S8~$#+7=|rj#M52 zU{_b+K|8%*wRQLU=$p2w`vqD%?g zH`f0vQba9-Agv4;~c+9BYImdWbR5?thKjrOeTQnYp6zN!0AQFl4uRg;ZGq&KJ(Pq z+r&`I&h;4Xv3{eHv?=|7AUmus^ve$otfZ|iFX&i!?S{rpyiA8PMfLS+3UE*1aX0b^ zDj6U*XZ4bD{4a!^J2!3x#J2sA!9r617!F3j4uI<~ttS1$allc&4y3z6v2EuureOV9 zCkC?QhNG$2+o->6FM1*9;!>u<<8yJYXh)&MjW*#JSvopIz`(GOuqwT8U5ijZ_jE-d zbE@wVvDR;E&&+k{S!Hi!?e&G}7jtuSi6|e??6__z@a9p_9l%-?g|2gTbzQzz?AO*l zNifn`v)j>enguPs>r`SlRV#W-Fk0n-iE(kNARy%~zZ|`4)haH_f6%AF+e#E|or)+* zp83=jCy_{=3#+O~UF4m!ZR0b~!otFKSnfMH^spyU%3pm9cD1&&baa%-)Rzi(+476Q zO72`v6T6#*h08D-tn7t@0>j%z1fH=tFpL|88q5{R$QN{?Vdxwj^`!J>kEhK$*s%WQ z_rYcNxd~gK5}|AS($CowFU4YB``BYeQjn0cl=OXmeyA?CzlOMQec5KSbAwM;jGTpi zebn3AT&Yy5yUCV%91-cSCcFAX6(!K-if^jwHeDvLcMnz4y@u74$XD^z2k5OO2iN~r zW~$P&5vA^W;rI1;5`-WWq8^Pu8*P&CAl73cXZE&V!{9u+h9&nC5@;)>>-~axf zNhC!tgDmBfyLve69sEd?B8Xsi@Qx_zZ0L6MC8YOhPg z(AsC7e$Y&^`Q5kZpk~g5SKNuz;O)kllKJo7ugBh}dK8nQI@tE7v7(qeyE6*ECqyu| z;#L@0Sy?0E3>ACmXrb$pAvKD<#AQ!#x-+o0SkaZQwuoNd=F`uf>!MQzI^%Q zz9B4dVknn_#FfL-IN^AkZo(~|5?YnUiPdG{w{(nKne2p2t#EFIZYj$r zq*pXMlXtd2mlzvxx1eBuZFnaLe(=ujDP^wa~Kiol{riOsFb)m1{6E32)fe9?a1KkY>pz|4TYp!;T&xE7E%s>!y zk%S-%$FCKu)WVnWqPclOl_zM~qw#@g_LFpWPAn`eOtb7x&^d*0y$hd)hll%GGfnQ)q(&3RNbT$b(co}8Zdy7pFi?Fcd*h8u>bWVmKu-iF)Uig~ zh2Q=JYS0AEWH6oz6ICB7K094BAj|78AUfyUuXT$A&E@#dyI5pVcn!I07KN@jU+K0l z@yh^=<`5R6J#u%{6P>q>g+D~2(U_C{PvYS0?7GL|oBX;mq3adJ+j8fGDftzlC=2Fo z8bWAUM{TFa{u|0Kym!x)Jn^R3{{G~-+e_+s z-xGz+0FSd<>k!zhvF<{ik_$&N46XV41_tjNQZ9D6@(xdCZj5m`tVAt|3$xU0gblN#QM3`s+P)#qy%rs44@Sb{V!JQ)R}?KBKU;2Irx_w3wP zW5j{+HW1LvA@J9r&tL*xwPN8&;^$g3kZS!bpmhujcTp6W@wL!rIyjoh%iy%`t!uxn zrFCQ1Uf#@xsh!s6!k1^j(l7>0Q*H}Z ue2XZy`s%!Tbi8RL*TM<+KY)L>0(>mxC0jb3o6~$VE-qlA{U$ literal 4228 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 M%obT;axM0M0Iji#@&Et; diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 9c6cfc62ed96709b50f658cfb96e2c0539651552..e65a637025c192cd19518967fe502dbb9804aa8c 100644 GIT binary patch delta 1190 zcmV;X1X=rpA*=}@iBL{Q4GJ0x0000DNk~Le0001N0001N2nGNE0FP!@&5&4geoM&v`wDp>!FDox9v7fC-ZzK`MjX)rI~p; z@6NZ+BnuD`5fKp)5fKp)5fKp)e-RN85fKp)5fKp)5fKp)Wts`SfQO056#%)=>u5MM z#?(SDqLrFpBJvb~4**O87!JIgrZRwU0L&X>ehiLXmt3xx|A%IjDs5w}1Z*T97rKP3qG*3D+GxI{BP`Cx) z+Bx4EB%0b_&bjXjg~CrrdGyT9&HY@j*T1#azS+jNM>u}SKR`;+)CRNGPLxWeSNHe# z|48$^BO@cvT5Dgqz)K8Le~hL!7=WvB9N&uLIP^N&VUW^z)Urzq{y>_5RCbSAg7u2# z-?XkpQ#%qx#MNrGk1CZ)s=LIYp`q)!T<$$|{)s_X$D`U{0B#Qs4t|LA$EDQk^&8gO zw=Qvvu5I}>kHqITH#e^V@HqaV)A;hMtE*R|D7ulr`nxh7)!t#of0$>+$H#y1-v6EQ zsq@B|ClWeV;^R?mu!g)bCLekcmz3yu)I1VI(K@2` z4zt#d@9gY+?Y&R(e}60GthG}K9iOn4A!1{wOai+^dbNTdlUg6B67c6F25be@d^}t(5iWtcqS3~(>b^8 zoVy=IQ58TtiOAh*wK_jNJ^k6r%1RxbJp{L2c!81-?a~tLybJGYwc4j^ zYisXMO-=oU2N(IW7dun206oFZBqH}JmC9Tk$6w+20%z_bCrR_BL!5J;Z)|M5+!Cwr zX}QDx_k1HFe|O8}^1EYWV_)v>?gEVU9~F0)_x?u!PDFMN4h|NUmzT%$`TQ4+Skywr zZ?1^gVzGFAVPTdv|X6T09fc-S2uJNOvOlSaRi|Gz)Ppl77Spt zN75J!V6-!74F)jUsWb-z80`e@!GH(R2zuV>IL}ezeBXZA@}DUScUTk0BeE3?;CRf; zNNm;D<1uS@SX1AQ$E*ee`ZQXWg8_XQE$hL6KHG?7ano^{zS)TM!X4Js7vr&)f&qOH zt=ED9JszzWg8@AptyhBqJsgdQh=_=Yh=_=Yh=@Y^7jHF&2Nt@Y2mk;807*qoM6N<$ Ef=;O~&j0`b literal 4228 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 M%obT;axM0M0Iji#@&Et; diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index 9c6cfc62ed96709b50f658cfb96e2c0539651552..af76607e6176af28db62c9a26babd87d879faf3e 100644 GIT binary patch delta 2406 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 M%obT;axM0M0Iji#@&Et; diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 9c6cfc62ed96709b50f658cfb96e2c0539651552..038c4900af8bb593a07baafdba568fdbd8f9e0af 100644 GIT binary patch delta 4275 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 delta 3941 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index 3b4e496a047b2e5d88de54620459656a912e1138..6c959e4401c788b051bdcab58a98b0a473c89be5 100644 GIT binary patch literal 6287 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 R8_V(LjG-Cs-6`i={{`$0R5kzr From 3de9f175bf6f01e6a0daf23b29cf94760dda585c Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 11 May 2020 15:45:15 +0200 Subject: [PATCH 36/37] moving the SIM card icon in Commons --- app/build.gradle | 2 +- app/src/main/res/drawable/ic_sim_vector.xml | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_sim_vector.xml diff --git a/app/build.gradle b/app/build.gradle index 181f4093..8490e2a1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.18' + implementation 'com.simplemobiletools:commons:5.27.24' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' diff --git a/app/src/main/res/drawable/ic_sim_vector.xml b/app/src/main/res/drawable/ic_sim_vector.xml deleted file mode 100644 index 085a7187..00000000 --- a/app/src/main/res/drawable/ic_sim_vector.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - From e2b714cabccf5650d0bc63c32a9c4e0a88dc5738 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 11 May 2020 15:46:40 +0200 Subject: [PATCH 37/37] adding a new string for Marking as Read, to be used in the notification --- app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 5 insertions(+) diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 775763bb..3418233a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -16,6 +16,7 @@ Gautos žinutės Nauja žinutė + Mark as Read Ar tikrai norite ištrinti visas šio pokalbio žinutes? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 98954d37..e26b0c63 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -16,6 +16,7 @@ SMS recebida Nova mensagem + Mark as Read Tem a certeza de que deseja eliminar todas as mensagens desta conversa? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8bf493e2..9c57104f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -16,6 +16,7 @@ Получено SMS Новое сообщение + Mark as Read Вы уверены, что хотите удалить все сообщения в этой переписке? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 745fd363..81fbe50b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -16,6 +16,7 @@ Prijatá SMS Nová správa + Označiť ako prečítané Ste si istý, že chcete odstrániť všetky správy tejto konverzácie? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 20a04b62..a476612e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,6 +16,7 @@ Received SMS New message + Mark as Read Are you sure you want to delete all messages of this conversation?