From 31e4872b9e0fb08ed26e0b246516412b1d33901d Mon Sep 17 00:00:00 2001 From: ltGuillaume Date: Fri, 15 May 2020 16:48:15 +0200 Subject: [PATCH 01/55] Dutch --- app/src/main/res/values-nl/strings.xml | 71 ++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 app/src/main/res/values-nl/strings.xml diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml new file mode 100644 index 00000000..fca93962 --- /dev/null +++ b/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,71 @@ + + Eenvoudig Berichtenbeheer (SMS) + Berichten + Typ een bericht… + Bericht niet verzonden. + Persoon toevoegen + Bijlage + Geen opgeslagen berichten gevonden + Een gesprek starten + + + Nieuw gesprek + Contact of nummer toevoegen… + Suggesties + + + Ontvangen berichten + Nieuw bericht + Als gelezen markeren + + + Alle berichten in dit gesprek verwijderen? + + + + %d gesperk + %d gesprekken + + + + + %d bericht + %d berichten + + + + Waarom heeft deze app toegang nodig tot het internet? + Dit is helaas nodig voor het verzenden van MMS-bijlagen. Het versturen van MMS-berichten onmogelijk maken zou een te groot nadeel t.o.v. andere apps betekenen en daarom hebben we besloten om het toch toe te voegen. + Zoals gewoonlijk bevat de app echter geen advertenties, tracking of analytics; de verbinding wordt alleen maar gebruikt voor het versturen van MMS-berichten. + + + + Eenvoudig Berichtenbeheer - Verstuur snel SMS/MMS + + Beheer eenvoudig en snel SMS- en MMS-berichten, zonder advertenties. + + Blijf gemakkelijk in contact met familieleden en vrienden door het versuren van SMS- en MMS-berichten. De app ondersteunt groepsberichten, evenals het blokkeren van nummers (vanaf Android 7). + + Het datumformaat kan worden ingesteld naar voorkeur. Ook kan geschakeld worden tussen 12- of 24-uursnotatie. + + Vergeleken met de competitie is deze app zeer compact en dus erg snel gedownload. + + De app is ontworpen volgens material design en heeft standaard een donker thema. De app heeft geen toegang tot het internet nodig en voorziet van meer privacy, veiligheid en stabiliteit dan andere apps. + + Bevat geen advertenties of onnodige machtigingen. Volledig open-source. Kleuren van de app kunnen worden aangepast. + + Probeer ook eens de andere apps van Simple Tools: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From 04f2a0a5ac688c5623da810d0abf58aa43d81f3a Mon Sep 17 00:00:00 2001 From: spkprs Date: Sat, 16 May 2020 01:30:24 +0300 Subject: [PATCH 02/55] Add files via upload --- app/src/main/res/values-el/strings.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 app/src/main/res/values-el/strings.xml diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml new file mode 100644 index 00000000..882a64cf --- /dev/null +++ b/app/src/main/res/values-el/strings.xml @@ -0,0 +1,17 @@ + + Απλός SMS Messenger + SMS Messenger + Πληκτρολογήστε ένα μήνυμα… + Το μήνυμα δεν έχει σταλεί. + Προσθήκη ατόμου + Συνημμένο + Δεν βρέθηκαν αποθηκευμένες συνομιλίες + Έναρξη συνομιλίας + Νέα συνομιλία + Προσθήκη επαφής ή αριθμού… + Προτάσεις + Ελήφθη SMS + Νέο μήνυμα + Σήμανση ως αναγνωσμένου + Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συνομιλίας; + From 6f8a8f3ed07a83c44976409527babf137b4444b5 Mon Sep 17 00:00:00 2001 From: spkprs Date: Sat, 16 May 2020 01:35:44 +0300 Subject: [PATCH 03/55] Add files via upload yeahh... )) --- app/src/main/res/values-el/strings.xml | 56 +++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 882a64cf..c76c6d52 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -7,11 +7,65 @@ Συνημμένο Δεν βρέθηκαν αποθηκευμένες συνομιλίες Έναρξη συνομιλίας + + Νέα συνομιλία Προσθήκη επαφής ή αριθμού… Προτάσεις + + Ελήφθη SMS Νέο μήνυμα Σήμανση ως αναγνωσμένου + + Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συνομιλίας; - + + + + %d συνομιλία + %d συνομιλίες + + + + + %d μήνυμα + %d μηνύματα + + + + Γιατί η εφαρμογή απαιτεί πρόσβαση στο Internet; + Δυστυχώς, απαιτείται για την αποστολή συνημμένων MMS. Το να μην είμαστε σε θέση να στείλουμε MMS θα αποτελούσε πραγματικά τεράστιο μειονέκτημα σε σύγκριση με άλλες εφαρμογές, επομένως αποφασίσαμε να ακολουθήσουμε αυτόν τον δρόμο. + Ωστόσο, όπως συνήθως, δεν υπάρχουν καθόλου διαφημίσεις, παρακολούθηση ή αναλύσεις, το διαδίκτυο χρησιμοποιείται μόνο για την αποστολή MMS. + + + + Απλός SMS Messenger - Εύκολη διαχείριση μηνυμάτων + + Ένας εύκολος και γρήγορος τρόπος διαχείρισης SMS και MMS χωρίς διαφημίσεις. + + Ένας εξαιρετικός τρόπος για να μείνετε σε επαφή με τους συγγενείς σας, στέλνοντας μηνύματα SMS και MMS. Η εφαρμογή χειρίζεται σωστά και την ομαδική ανταλλαγή μηνυμάτων, όπως και τον αποκλεισμό αριθμών από Android 7+. + + Προσφέρει πολλές μορφές ημερομηνίας για να διαλέξετε, ώστε να αισθάνεστε άνετα να τις χρησιμοποιήσετε. Μπορείτε επίσης να κάνετε εναλλαγή μεταξύ 12 και 24 ωρών. + + Έχει πραγματικά πολύ μικρό μέγεθος εφαρμογής σε σύγκριση με τον ανταγωνισμό, καθιστώντας την πραγματικά γρήγορη στη λήψη της. + + Διατίθεται με σχεδίαση υλικού και σκούρο θέμα από προεπιλογή, παρέχει εξαιρετική εμπειρία χρήστη για εύκολη χρήση. Η έλλειψη πρόσβασης στο διαδίκτυο σάς παρέχει περισσότερο απόρρητο, ασφάλεια και σταθερότητα από ό,τι άλλες εφαρμογές. + + Δεν περιέχει διαφημίσεις ή περιττά δικαιώματα. Είναι πλήρως ανοιχτού κώδικα, παρέχει προσαρμόσιμα χρώματα. + + Δείτε την πλήρη σειρά Simple Tools here: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + \ No newline at end of file From 8c5df7000aafde4f8d1d0ea27b9c46ad2cf9b8ef Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 16 May 2020 08:53:44 +0200 Subject: [PATCH 04/55] updating greek app data --- .../metadata/android/el/full_description.txt | 18 ++++++++++++++++++ .../metadata/android/el/short_description.txt | 1 + fastlane/metadata/android/el/title.txt | 1 + 3 files changed, 20 insertions(+) create mode 100644 fastlane/metadata/android/el/full_description.txt create mode 100644 fastlane/metadata/android/el/short_description.txt create mode 100644 fastlane/metadata/android/el/title.txt diff --git a/fastlane/metadata/android/el/full_description.txt b/fastlane/metadata/android/el/full_description.txt new file mode 100644 index 00000000..00238e7b --- /dev/null +++ b/fastlane/metadata/android/el/full_description.txt @@ -0,0 +1,18 @@ +Ένας εξαιρετικός τρόπος για να μείνετε σε επαφή με τους συγγενείς σας, στέλνοντας μηνύματα SMS και MMS. Η εφαρμογή χειρίζεται σωστά και την ομαδική ανταλλαγή μηνυμάτων, όπως και τον αποκλεισμό αριθμών από Android 7+. + +Προσφέρει πολλές μορφές ημερομηνίας για να διαλέξετε, ώστε να αισθάνεστε άνετα να τις χρησιμοποιήσετε. Μπορείτε επίσης να κάνετε εναλλαγή μεταξύ 12 και 24 ωρών. + +Έχει πραγματικά πολύ μικρό μέγεθος εφαρμογής σε σύγκριση με τον ανταγωνισμό, καθιστώντας την πραγματικά γρήγορη στη λήψη της. + +Διατίθεται με σχεδίαση υλικού και σκούρο θέμα από προεπιλογή, παρέχει εξαιρετική εμπειρία χρήστη για εύκολη χρήση. Η έλλειψη πρόσβασης στο διαδίκτυο σάς παρέχει περισσότερο απόρρητο, ασφάλεια και σταθερότητα από ό,τι άλλες εφαρμογές. + +Δεν περιέχει διαφημίσεις ή περιττά δικαιώματα. Είναι πλήρως ανοιχτού κώδικα, παρέχει προσαρμόσιμα χρώματα. + +Δείτε την πλήρη σειρά Simple Tools here: +https://www.simplemobiletools.com + +Facebook: +https://www.facebook.com/simplemobiletools + +Reddit: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/el/short_description.txt b/fastlane/metadata/android/el/short_description.txt new file mode 100644 index 00000000..b5c05944 --- /dev/null +++ b/fastlane/metadata/android/el/short_description.txt @@ -0,0 +1 @@ +Ένας εύκολος και γρήγορος τρόπος διαχείρισης SMS και MMS χωρίς διαφημίσεις. diff --git a/fastlane/metadata/android/el/title.txt b/fastlane/metadata/android/el/title.txt new file mode 100644 index 00000000..a9e7f5bb --- /dev/null +++ b/fastlane/metadata/android/el/title.txt @@ -0,0 +1 @@ +Απλός SMS Messenger - Εύκολη διαχείριση μηνυμάτων From c376cdb2a5e70607e97f113a18b2ff065c424caf Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Mon, 18 May 2020 12:28:53 +0200 Subject: [PATCH 05/55] adding f-droid link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 574cb344..6ab5c2c8 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Reddit: https://www.reddit.com/r/SimpleMobileTools Get it on Google Play +Get it on F-Droid
App image From d223266f1b47e87d5bf0ba4a682b29fe16663b9b Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 May 2020 23:06:11 +0200 Subject: [PATCH 06/55] updating commons --- app/build.gradle | 2 +- .../smsmessenger/activities/NewConversationActivity.kt | 2 +- .../simplemobiletools/smsmessenger/activities/ThreadActivity.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 46335361..817def84 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.29' + implementation 'com.simplemobiletools:commons:5.28.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 fc07761c..54ab8e58 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -103,7 +103,7 @@ class NewConversationActivity : SimpleActivity() { private fun fetchContacts() { fillSuggestedContacts { - SimpleContactsHelper(this).getAvailableContacts { + SimpleContactsHelper(this).getAvailableContacts(false) { allContacts = it runOnUiThread { 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 cd545422..4bbe932e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -202,7 +202,7 @@ class ThreadActivity : SimpleActivity() { thread_messages_list.adapter = adapter } - SimpleContactsHelper(this).getAvailableContacts { + SimpleContactsHelper(this).getAvailableContacts(false) { runOnUiThread { val adapter = AutoCompleteTextViewAdapter(this, it) add_contact_or_number.setAdapter(adapter) From 910aa365ac07ddb1fe7952106db9169db8f612bd Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 May 2020 23:16:06 +0200 Subject: [PATCH 07/55] fix #25, ensure that the top conversations are at the top --- .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 5 ++++- 1 file changed, 4 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 dee4134e..a41bdf12 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -185,8 +185,9 @@ fun Context.getConversations(): ArrayList { val selection = "${Threads.MESSAGE_COUNT} > ?" val selectionArgs = arrayOf("0") + val sortOrder = "${Threads.DATE} DESC" val conversations = ArrayList() - queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> val id = cursor.getIntValue(Threads._ID) var snippet = cursor.getStringValue(Threads.SNIPPET) ?: "" if (snippet.isEmpty()) { @@ -211,9 +212,11 @@ fun Context.getConversations(): ArrayList { 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, phoneNumbers.first()) + conversations.add(conversation) } + conversations.sortByDescending { it.date } return conversations } From db90f0f08c0060239e3937ed01c32f752e335a21 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 May 2020 23:22:27 +0200 Subject: [PATCH 08/55] check if no message came from a privately stored contact in Simple Contacts --- .../smsmessenger/activities/MainActivity.kt | 11 +++++++++++ .../smsmessenger/extensions/Context.kt | 1 + .../smsmessenger/models/Conversation.kt | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) 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 4e9ae074..f2636220 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -144,8 +144,19 @@ class MainActivity : SimpleActivity() { private fun initMessenger() { storeStateVariables() + val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() + ensureBackgroundThread { val conversations = getConversations() + + // check if no message came from a privately stored contact in Simple Contacts + val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + conversations.filter { it.title == it.phoneNumber }.forEach { conversation -> + privateContacts.firstOrNull { it.phoneNumber == conversation.phoneNumber }?.apply { + conversation.title = name + } + } + runOnUiThread { val hasConversations = conversations.isNotEmpty() conversations_list.beVisibleIf(hasConversations) 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 a41bdf12..31606e9d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -186,6 +186,7 @@ fun Context.getConversations(): ArrayList { val selection = "${Threads.MESSAGE_COUNT} > ?" val selectionArgs = arrayOf("0") val sortOrder = "${Threads.DATE} DESC" + val conversations = ArrayList() queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> val id = cursor.getIntValue(Threads._ID) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index 65329fc8..8b14decb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -1,5 +1,5 @@ package com.simplemobiletools.smsmessenger.models data class Conversation( - val id: Int, val snippet: String, val date: Int, val read: Boolean, val title: String, val photoUri: String, + val id: Int, val snippet: String, val date: Int, val read: Boolean, var title: String, val photoUri: String, val isGroupConversation: Boolean, val phoneNumber: String) From 8760d85d2b0dead90098721cb9973f6a751a6924 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 May 2020 23:28:17 +0200 Subject: [PATCH 09/55] recognize private contacts at the thread screen too --- .../smsmessenger/activities/ThreadActivity.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 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 4bbe932e..05752f48 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -30,10 +30,7 @@ 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.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.helpers.* import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter @@ -89,6 +86,7 @@ class ThreadActivity : SimpleActivity() { } private fun setupThread() { + val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() ensureBackgroundThread { messages = getMessages(threadId) participants = if (messages.isEmpty()) { @@ -97,6 +95,14 @@ class ThreadActivity : SimpleActivity() { messages.first().participants } + // check if no participant came from a privately stored contact in Simple Contacts + val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + participants.filter { it.name == it.phoneNumber }.forEach { participant -> + privateContacts.firstOrNull { it.phoneNumber == participant.phoneNumber }?.apply { + participant.name = name + } + } + if (participants.isEmpty()) { val name = intent.getStringExtra(THREAD_TITLE) ?: "" val number = intent.getStringExtra(THREAD_NUMBER) From 83dcc7423c0b0cfd563d48602104b19ded64ac65 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 May 2020 23:34:27 +0200 Subject: [PATCH 10/55] use proper placeholder avatars at private contacts too --- .../smsmessenger/activities/ThreadActivity.kt | 8 ++++++++ .../smsmessenger/adapters/ThreadAdapter.kt | 1 + .../com/simplemobiletools/smsmessenger/models/Message.kt | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) 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 05752f48..f92b68c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -95,14 +95,22 @@ class ThreadActivity : SimpleActivity() { messages.first().participants } + val senderNumbersToReplace = HashMap() // check if no participant came from a privately stored contact in Simple Contacts val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) participants.filter { it.name == it.phoneNumber }.forEach { participant -> privateContacts.firstOrNull { it.phoneNumber == participant.phoneNumber }?.apply { + senderNumbersToReplace[participant.phoneNumber] = name participant.name = name } } + messages.forEach { message -> + if (senderNumbersToReplace.keys.contains(message.senderName)) { + message.senderName = senderNumbersToReplace[message.senderName]!! + } + } + if (participants.isEmpty()) { val name = intent.getStringExtra(THREAD_TITLE) ?: "" val number = intent.getStringExtra(THREAD_NUMBER) 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 0f5a6531..337452f9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -44,6 +44,7 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private val roundedCornersRadius = resources.getDimension(R.dimen.normal_margin).toInt() + @SuppressLint("MissingPermission") private val hasMultipleSIMCards = SubscriptionManager.from(activity).activeSubscriptionInfoList?.size ?: 0 > 1 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 4285d527..e18df07c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt @@ -5,6 +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, val subscriptionId: Int) : ThreadItem() { + val isMMS: Boolean, val attachment: MessageAttachment?, var senderName: String, val senderPhotoUri: String, val subscriptionId: Int) : ThreadItem() { fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX } From 422ccf4b6a532b1f679d4e8adc7ad1a1353e0f7f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 May 2020 23:38:56 +0200 Subject: [PATCH 11/55] lets check those private contacts only if we actually have any --- .../smsmessenger/activities/MainActivity.kt | 8 +++++--- .../smsmessenger/activities/ThreadActivity.kt | 20 ++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) 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 f2636220..e71e842c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -151,9 +151,11 @@ class MainActivity : SimpleActivity() { // check if no message came from a privately stored contact in Simple Contacts val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) - conversations.filter { it.title == it.phoneNumber }.forEach { conversation -> - privateContacts.firstOrNull { it.phoneNumber == conversation.phoneNumber }?.apply { - conversation.title = name + if (privateContacts.isNotEmpty()) { + conversations.filter { it.title == it.phoneNumber }.forEach { conversation -> + privateContacts.firstOrNull { it.phoneNumber == conversation.phoneNumber }?.apply { + conversation.title = 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 f92b68c1..bb0d7c19 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -95,19 +95,21 @@ class ThreadActivity : SimpleActivity() { messages.first().participants } - val senderNumbersToReplace = HashMap() // check if no participant came from a privately stored contact in Simple Contacts val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) - participants.filter { it.name == it.phoneNumber }.forEach { participant -> - privateContacts.firstOrNull { it.phoneNumber == participant.phoneNumber }?.apply { - senderNumbersToReplace[participant.phoneNumber] = name - participant.name = name + if (privateContacts.isNotEmpty()) { + val senderNumbersToReplace = HashMap() + participants.filter { it.name == it.phoneNumber }.forEach { participant -> + privateContacts.firstOrNull { it.phoneNumber == participant.phoneNumber }?.apply { + senderNumbersToReplace[participant.phoneNumber] = name + participant.name = name + } } - } - messages.forEach { message -> - if (senderNumbersToReplace.keys.contains(message.senderName)) { - message.senderName = senderNumbersToReplace[message.senderName]!! + messages.forEach { message -> + if (senderNumbersToReplace.keys.contains(message.senderName)) { + message.senderName = senderNumbersToReplace[message.senderName]!! + } } } From 38deb780a6034eb8febba70919243ea486a35347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Tue, 19 May 2020 23:31:13 +0100 Subject: [PATCH 12/55] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e26b0c63..ebf56905 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -16,7 +16,7 @@ SMS recebida Nova mensagem - Mark as Read + Marcar como lida Tem a certeza de que deseja eliminar todas as mensagens desta conversa? @@ -54,7 +54,7 @@ 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: + Consulte o conjunto completo de aplicações Simple Tools aqui: https://www.simplemobiletools.com Facebook: From 2a8b3578157f8fedd9adae1b00933ca115841832 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 11:27:45 +0200 Subject: [PATCH 13/55] fixing a typo in the portugals fastlane app data --- fastlane/metadata/android/pt/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/pt/full_description.txt b/fastlane/metadata/android/pt/full_description.txt index 9f3741ff..88af0785 100644 --- a/fastlane/metadata/android/pt/full_description.txt +++ b/fastlane/metadata/android/pt/full_description.txt @@ -8,7 +8,7 @@ Disponibiliza um design atrativo e um tema escuro por omissão. A não utilizaç 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: +Consulte o conjunto completo de aplicações Simple Tools aqui: https://www.simplemobiletools.com Facebook: From 2344a49b260457d870a63bcb82f131c47e8dc5f8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 15:10:55 +0200 Subject: [PATCH 14/55] list privately stored contacts at the New Conversation too --- .../smsmessenger/activities/NewConversationActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) 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 54ab8e58..dcc5f165 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -7,6 +7,7 @@ import android.view.Menu import android.view.WindowManager import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.MyContactsContentProvider import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread @@ -103,9 +104,16 @@ class NewConversationActivity : SimpleActivity() { private fun fetchContacts() { fillSuggestedContacts { + val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() SimpleContactsHelper(this).getAvailableContacts(false) { allContacts = it + val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + if (privateContacts.isNotEmpty()) { + allContacts.addAll(privateContacts) + allContacts.sort() + } + runOnUiThread { setupAdapter(allContacts) } From 3e8697d7cc68aa46e5a318e6ab0ca1dbd27132b7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 15:13:29 +0200 Subject: [PATCH 15/55] removing the noHistory flag from NewConversationActivity --- app/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 770b80db..d8ef44e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,7 +40,6 @@ From 2e20dd7454d8fc531d40158c0ac360d019ae13a0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 15:45:34 +0200 Subject: [PATCH 16/55] count with the privately stored contacts at Suggestions --- .../activities/NewConversationActivity.kt | 7 ++++--- .../smsmessenger/extensions/Context.kt | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 6 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 dcc5f165..4f5b1fea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -26,6 +26,7 @@ import kotlin.collections.ArrayList class NewConversationActivity : SimpleActivity() { private var allContacts = ArrayList() + private var privateContacts = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -104,11 +105,9 @@ class NewConversationActivity : SimpleActivity() { private fun fetchContacts() { fillSuggestedContacts { - val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() SimpleContactsHelper(this).getAvailableContacts(false) { allContacts = it - val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) if (privateContacts.isNotEmpty()) { allContacts.addAll(privateContacts) allContacts.sort() @@ -143,8 +142,10 @@ class NewConversationActivity : SimpleActivity() { } private fun fillSuggestedContacts(callback: () -> Unit) { + val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() ensureBackgroundThread { - val suggestions = getSuggestedContacts() + privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + val suggestions = getSuggestedContacts(privateContacts) runOnUiThread { suggestions_holder.removeAllViews() if (suggestions.isEmpty()) { 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 31606e9d..d7f0ea8c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -367,7 +367,7 @@ fun Context.getPhoneNumberFromAddressId(canonicalAddressId: Int): String { return "" } -fun Context.getSuggestedContacts(): ArrayList { +fun Context.getSuggestedContacts(privateContacts: ArrayList): ArrayList { val contacts = ArrayList() val uri = Sms.CONTENT_URI val projection = arrayOf( @@ -381,11 +381,22 @@ fun Context.getSuggestedContacts(): ArrayList { queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val senderNumber = cursor.getStringValue(Sms.ADDRESS) ?: return@queryCursor val namePhoto = getNameAndPhotoFromPhoneNumber(senderNumber) - if (namePhoto == null || namePhoto.name == senderNumber || isNumberBlocked(senderNumber)) { + var senderName = namePhoto?.name ?: "" + if (namePhoto == null || isNumberBlocked(senderNumber)) { return@queryCursor + } else if (namePhoto.name == senderNumber) { + if (privateContacts.isNotEmpty()) { + val privateContact = privateContacts.firstOrNull { it.phoneNumber == senderNumber } + if (privateContact != null) { + senderName = privateContact.name + } else { + return@queryCursor + } + } else { + return@queryCursor + } } - val senderName = namePhoto.name val photoUri = namePhoto.photoUri ?: "" val contact = SimpleContact(0, 0, senderName, photoUri, senderNumber) if (!contacts.map { it.phoneNumber.trimToComparableNumber() }.contains(senderNumber.trimToComparableNumber())) { From 3569bce6682c24ddc2e35c5aaf6299fdec90cc77 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 15:55:35 +0200 Subject: [PATCH 17/55] add private contacts at the Add Participant suggestions --- .../smsmessenger/activities/ThreadActivity.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 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 bb0d7c19..613d5397 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -54,6 +54,7 @@ class ThreadActivity : SimpleActivity() { private var threadItems = ArrayList() private var bus: EventBus? = null private var participants = ArrayList() + private var privateContacts = ArrayList() private var messages = ArrayList() private val availableSIMCards = ArrayList() private var attachmentUris = LinkedHashSet() @@ -96,7 +97,7 @@ class ThreadActivity : SimpleActivity() { } // check if no participant came from a privately stored contact in Simple Contacts - val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) if (privateContacts.isNotEmpty()) { val senderNumbersToReplace = HashMap() participants.filter { it.name == it.phoneNumber }.forEach { participant -> @@ -218,9 +219,10 @@ class ThreadActivity : SimpleActivity() { thread_messages_list.adapter = adapter } - SimpleContactsHelper(this).getAvailableContacts(false) { + SimpleContactsHelper(this).getAvailableContacts(false) { contacts -> + contacts.addAll(privateContacts) runOnUiThread { - val adapter = AutoCompleteTextViewAdapter(this, it) + val adapter = AutoCompleteTextViewAdapter(this, contacts) add_contact_or_number.setAdapter(adapter) add_contact_or_number.imeOptions = EditorInfo.IME_ACTION_NEXT add_contact_or_number.setOnItemClickListener { _, _, position, _ -> From 94086547a5533a31986195f0cae2efa0a393afc6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:11:36 +0200 Subject: [PATCH 18/55] do not show an error message at loading contact image at the Conversation --- .../simplemobiletools/smsmessenger/activities/MainActivity.kt | 3 +-- .../smsmessenger/activities/ThreadActivity.kt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) 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 e71e842c..756573b9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -128,9 +128,9 @@ class MainActivity : SimpleActivity() { handlePermission(PERMISSION_SEND_SMS) { if (it) { handlePermission(PERMISSION_READ_CONTACTS) { + initMessenger() bus = EventBus.getDefault() bus!!.register(this) - initMessenger() } } else { finish() @@ -177,7 +177,6 @@ class MainActivity : SimpleActivity() { } } - no_conversations_placeholder_2.setOnClickListener { launchNewConversation() } 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 613d5397..abae32a5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -468,7 +468,6 @@ class ThreadActivity : SimpleActivity() { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { attachmentView.thread_attachment_preview.beGone() attachmentView.thread_remove_attachment.beGone() - showErrorToast(e?.localizedMessage ?: "") return false } From 7d1e28203e100c76b0795763e15823383cb4b1b3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:21:57 +0200 Subject: [PATCH 19/55] changing the conversation fetcher code style a bit --- .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 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 d7f0ea8c..27c5199b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -188,6 +188,7 @@ fun Context.getConversations(): ArrayList { val sortOrder = "${Threads.DATE} DESC" val conversations = ArrayList() + val simpleContactHelper = SimpleContactsHelper(this) queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> val id = cursor.getIntValue(Threads._ID) var snippet = cursor.getStringValue(Threads.SNIPPET) ?: "" @@ -200,7 +201,6 @@ fun Context.getConversations(): ArrayList { date /= 1000 } - val read = cursor.getIntValue(Threads.READ) == 1 val rawIds = cursor.getStringValue(Threads.RECIPIENT_IDS) val recipientIds = rawIds.split(" ").filter { it.areDigitsOnly() }.map { it.toInt() }.toMutableList() val phoneNumbers = getThreadPhoneNumbers(recipientIds) @@ -210,8 +210,9 @@ fun Context.getConversations(): ArrayList { val names = getThreadContactNames(phoneNumbers) val title = TextUtils.join(", ", names.toTypedArray()) - val photoUri = if (phoneNumbers.size == 1) SimpleContactsHelper(this).getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" + val photoUri = if (phoneNumbers.size == 1) simpleContactHelper.getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" val isGroupConversation = phoneNumbers.size > 1 + val read = cursor.getIntValue(Threads.READ) == 1 val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first()) conversations.add(conversation) From 81e5905bf77f39f8372b84684122d8a6dd7bbd74 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:47:22 +0200 Subject: [PATCH 20/55] update commons to 5.28.14 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 817def84..d94c6922 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.28.12' + implementation 'com.simplemobiletools:commons:5.28.14' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' From 1c1a2d28554714c945039b18f20da8a2224c45a2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:52:43 +0200 Subject: [PATCH 21/55] get the Photo Uri of private contacts too --- .../simplemobiletools/smsmessenger/activities/MainActivity.kt | 1 + .../smsmessenger/activities/ThreadActivity.kt | 1 + .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) 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 756573b9..01c694b9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -155,6 +155,7 @@ class MainActivity : SimpleActivity() { conversations.filter { it.title == it.phoneNumber }.forEach { conversation -> privateContacts.firstOrNull { it.phoneNumber == conversation.phoneNumber }?.apply { conversation.title = name + conversation.photoUri = photoUri } } } 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 abae32a5..c36d4a6a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -104,6 +104,7 @@ class ThreadActivity : SimpleActivity() { privateContacts.firstOrNull { it.phoneNumber == participant.phoneNumber }?.apply { senderNumbersToReplace[participant.phoneNumber] = name participant.name = name + participant.photoUri = photoUri } } 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 27c5199b..8fab8ba9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -383,6 +383,7 @@ fun Context.getSuggestedContacts(privateContacts: ArrayList): Arr val senderNumber = cursor.getStringValue(Sms.ADDRESS) ?: return@queryCursor val namePhoto = getNameAndPhotoFromPhoneNumber(senderNumber) var senderName = namePhoto?.name ?: "" + var photoUri = namePhoto?.photoUri ?: "" if (namePhoto == null || isNumberBlocked(senderNumber)) { return@queryCursor } else if (namePhoto.name == senderNumber) { @@ -390,6 +391,7 @@ fun Context.getSuggestedContacts(privateContacts: ArrayList): Arr val privateContact = privateContacts.firstOrNull { it.phoneNumber == senderNumber } if (privateContact != null) { senderName = privateContact.name + photoUri = privateContact.photoUri } else { return@queryCursor } @@ -398,7 +400,6 @@ fun Context.getSuggestedContacts(privateContacts: ArrayList): Arr } } - val photoUri = namePhoto.photoUri ?: "" val contact = SimpleContact(0, 0, senderName, photoUri, senderNumber) if (!contacts.map { it.phoneNumber.trimToComparableNumber() }.contains(senderNumber.trimToComparableNumber())) { contacts.add(contact) From 60c994756d12c59c75d7141c10aeb7b17bbce29b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:53:38 +0200 Subject: [PATCH 22/55] make photoUri changeable at the Conversation model --- .../com/simplemobiletools/smsmessenger/models/Conversation.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index 8b14decb..f5cf9da3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -1,5 +1,5 @@ package com.simplemobiletools.smsmessenger.models data class Conversation( - val id: Int, val snippet: String, val date: Int, val read: Boolean, var title: String, val photoUri: String, + val id: Int, val snippet: String, val date: Int, val read: Boolean, var title: String, var photoUri: String, val isGroupConversation: Boolean, val phoneNumber: String) From 070a2dc367b008783d3be8401b5d5cfe6ea65444 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:56:36 +0200 Subject: [PATCH 23/55] update version to 5.1.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d94c6922..26bccf7c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 29 - versionCode 5 - versionName "5.1.2" + versionCode 6 + versionName "5.1.3" setProperty("archivesBaseName", "sms-messenger") } From e042f7f1e0c4401cc40de03f73d1f6a275ae24bf Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 16:56:43 +0200 Subject: [PATCH 24/55] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/6.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/6.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 569884ab..81b9afde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 5.1.3 *(2020-05-20)* +---------------------------- + + * Adding support for accessing private contacts stored in Simple Contacts Pro (to be added soon) + * Make sure the conversations are sorted properly + * Added some other UI and translation improvements + Version 5.1.2 *(2020-05-13)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/6.txt b/fastlane/metadata/android/en-US/changelogs/6.txt new file mode 100644 index 00000000..a5e1385f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/6.txt @@ -0,0 +1,3 @@ + * Adding support for accessing private contacts stored in Simple Contacts Pro (to be added soon) + * Make sure the conversations are sorted properly + * Added some other UI and translation improvements From b90110b108f71326401113c0d9a65804ab3203fc Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 May 2020 21:42:59 +0200 Subject: [PATCH 25/55] change inputtype of the SMS message to cap sentences --- app/src/main/res/layout/activity_thread.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index 3978a078..0a306385 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -161,6 +161,7 @@ android:background="@android:color/transparent" android:gravity="center_vertical" android:hint="@string/type_a_message" + android:inputType="textCapSentences" android:minHeight="@dimen/normal_icon_size" /> Date: Sat, 23 May 2020 17:15:27 +0200 Subject: [PATCH 26/55] improving blocked number checking performance --- app/build.gradle | 2 +- .../smsmessenger/extensions/Context.kt | 21 +++++++------------ .../smsmessenger/receivers/MmsReceiver.kt | 2 +- .../smsmessenger/receivers/SmsReceiver.kt | 2 +- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 26bccf7c..ef42ed28 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.28.14' + implementation 'com.simplemobiletools:commons:5.28.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/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 8fab8ba9..a28dd4ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -48,6 +48,7 @@ fun Context.getMessages(threadId: Int): ArrayList { val sortOrder = "${Sms._ID} DESC LIMIT 100" val blockStatus = HashMap() + val blockedNumbers = getBlockedNumbers() var messages = ArrayList() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val senderNumber = cursor.getStringValue(Sms.ADDRESS) ?: return@queryCursor @@ -55,7 +56,7 @@ fun Context.getMessages(threadId: Int): ArrayList { val isNumberBlocked = if (blockStatus.containsKey(senderNumber)) { blockStatus[senderNumber]!! } else { - val isBlocked = isNumberBlocked(senderNumber) + val isBlocked = isNumberBlocked(senderNumber, blockedNumbers) blockStatus[senderNumber] = isBlocked isBlocked } @@ -148,7 +149,7 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< messages.add(message) participants.forEach { - contactsMap.put(it.rawId, it) + contactsMap[it.rawId] = it } } @@ -189,6 +190,7 @@ fun Context.getConversations(): ArrayList { val conversations = ArrayList() val simpleContactHelper = SimpleContactsHelper(this) + val blockedNumbers = getBlockedNumbers() queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> val id = cursor.getIntValue(Threads._ID) var snippet = cursor.getStringValue(Threads.SNIPPET) ?: "" @@ -204,7 +206,7 @@ fun Context.getConversations(): ArrayList { val rawIds = cursor.getStringValue(Threads.RECIPIENT_IDS) val recipientIds = rawIds.split(" ").filter { it.areDigitsOnly() }.map { it.toInt() }.toMutableList() val phoneNumbers = getThreadPhoneNumbers(recipientIds) - if (phoneNumbers.any { isNumberBlocked(it) }) { + if (phoneNumbers.any { isNumberBlocked(it, blockedNumbers) }) { return@queryCursor } @@ -378,13 +380,14 @@ fun Context.getSuggestedContacts(privateContacts: ArrayList): Arr val selection = "1 == 1) GROUP BY (${Sms.ADDRESS}" val selectionArgs = null val sortOrder = "${Sms.DATE} DESC LIMIT 20" + val blockedNumbers = getBlockedNumbers() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val senderNumber = cursor.getStringValue(Sms.ADDRESS) ?: return@queryCursor val namePhoto = getNameAndPhotoFromPhoneNumber(senderNumber) var senderName = namePhoto?.name ?: "" var photoUri = namePhoto?.photoUri ?: "" - if (namePhoto == null || isNumberBlocked(senderNumber)) { + if (namePhoto == null || isNumberBlocked(senderNumber, blockedNumbers)) { return@queryCursor } else if (namePhoto.name == senderNumber) { if (privateContacts.isNotEmpty()) { @@ -499,16 +502,6 @@ 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) -} - @SuppressLint("NewApi") fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?, messageId: Int, isMMS: Boolean) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt index 865fb5a3..da7f70be 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt @@ -3,10 +3,10 @@ package com.simplemobiletools.smsmessenger.receivers import android.content.Context import android.net.Uri import com.bumptech.glide.Glide +import com.simplemobiletools.commons.extensions.isNumberBlocked import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.extensions.getLatestMMS -import com.simplemobiletools.smsmessenger.extensions.isNumberBlocked import com.simplemobiletools.smsmessenger.extensions.showReceivedMessageNotification // more info at https://github.com/klinker41/android-smsmms 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 17c6f62b..4e79e291 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -4,9 +4,9 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.provider.Telephony +import com.simplemobiletools.commons.extensions.isNumberBlocked import com.simplemobiletools.smsmessenger.extensions.getThreadId import com.simplemobiletools.smsmessenger.extensions.insertNewSMS -import com.simplemobiletools.smsmessenger.extensions.isNumberBlocked import com.simplemobiletools.smsmessenger.extensions.showReceivedMessageNotification import com.simplemobiletools.smsmessenger.helpers.refreshMessages From 5ab95c00fdce57a5e54e70ed26a5188b44bd7b57 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 23 May 2020 18:20:50 +0200 Subject: [PATCH 27/55] updating commons to 5.28.19 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ef42ed28..964ffebb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.28.18' + implementation 'com.simplemobiletools:commons:5.28.19' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' From d8e2a774e3f044fc344eae238c6fef75fd3543c5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 23 May 2020 18:38:36 +0200 Subject: [PATCH 28/55] fix #34, allow adding new people to a conversation --- .../smsmessenger/activities/ThreadActivity.kt | 2 +- .../smsmessenger/adapters/AutoCompleteTextViewAdapter.kt | 7 ++++++- 2 files changed, 7 insertions(+), 2 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 c36d4a6a..51b902b4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -238,7 +238,7 @@ class ThreadActivity : SimpleActivity() { } } - confirm_inserted_number.setOnClickListener { + confirm_inserted_number?.setOnClickListener { val number = add_contact_or_number.value val contact = SimpleContact(number.hashCode(), number.hashCode(), number, "", number) addSelectedContact(contact) 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 75611076..68c38b7f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt @@ -13,7 +13,6 @@ import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity 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 { @@ -25,6 +24,12 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar listItem!!.apply { tag = contact.name.isNotEmpty() + // clickable and focusable properties seem to break Autocomplete clicking, so remove them + findViewById(R.id.item_contact_frame).apply { + isClickable = false + isFocusable = false + } + findViewById(R.id.item_contact_name).text = contact.name findViewById(R.id.item_contact_number).text = contact.phoneNumber From 3ac08e2b21bbc6c4667aa468f8f24af39e904d85 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 23 May 2020 18:56:24 +0200 Subject: [PATCH 29/55] allow blocking numbers directly from the main screen --- .../adapters/ConversationsAdapter.kt | 34 +++++++++++++++++++ app/src/main/res/menu/cab_conversations.xml | 5 +++ 2 files changed, 39 insertions(+) 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 ed427e89..74f1df0f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.smsmessenger.adapters import android.content.Intent import android.graphics.Typeface +import android.text.TextUtils import android.view.Menu import android.view.View import android.view.ViewGroup @@ -9,6 +10,7 @@ import android.widget.TextView import com.bumptech.glide.Glide import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog +import com.simplemobiletools.commons.extensions.addBlockedNumber import com.simplemobiletools.commons.extensions.formatDateOrTime import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.helpers.KEY_PHONE @@ -45,6 +47,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis when (id) { R.id.cab_add_number_to_contact -> addNumberToContact() + R.id.cab_block_number -> askConfirmBlock() R.id.cab_select_all -> selectAll() R.id.cab_delete -> askConfirmDelete() } @@ -74,6 +77,37 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis override fun getItemCount() = conversations.size + private fun askConfirmBlock() { + val numbers = TextUtils.join(", ", getSelectedItems().distinctBy { it.phoneNumber }.map { it.phoneNumber }) + val baseString = R.string.block_confirmation + val question = String.format(resources.getString(baseString), numbers) + + ConfirmationDialog(activity, question) { + blockNumbers() + } + } + + private fun blockNumbers() { + if (selectedKeys.isEmpty()) { + return + } + + val numbersToBlock = getSelectedItems() + val positions = getSelectedItemPositions() + conversations.removeAll(numbersToBlock) + + ensureBackgroundThread { + numbersToBlock.map { it.phoneNumber }.forEach { number -> + activity.addBlockedNumber(number) + } + + activity.runOnUiThread { + removeSelectedItems(positions) + finishActMode() + } + } + } + private fun askConfirmDelete() { val itemsCnt = selectedKeys.size val items = resources.getQuantityString(R.plurals.delete_conversations, itemsCnt, itemsCnt) diff --git a/app/src/main/res/menu/cab_conversations.xml b/app/src/main/res/menu/cab_conversations.xml index 54c3891e..84e02dc5 100644 --- a/app/src/main/res/menu/cab_conversations.xml +++ b/app/src/main/res/menu/cab_conversations.xml @@ -6,6 +6,11 @@ android:icon="@drawable/ic_add_person_vector" android:title="@string/add_number_to_contact" app:showAsAction="ifRoom" /> + Date: Sat, 23 May 2020 19:03:14 +0200 Subject: [PATCH 30/55] minor code reformatting at number blocking confirmation --- .../smsmessenger/activities/ThreadActivity.kt | 5 ++--- .../smsmessenger/adapters/ConversationsAdapter.kt | 6 +++--- 2 files changed, 5 insertions(+), 6 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 51b902b4..5c69142b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -326,10 +326,9 @@ class ThreadActivity : SimpleActivity() { } private fun blockNumber() { - val baseString = R.string.block_confirmation - val numbers = participants.map { it.phoneNumber }.toTypedArray() + val numbers = participants.map { it.phoneNumber } val numbersString = TextUtils.join(", ", numbers) - val question = String.format(resources.getString(baseString), numbersString) + val question = String.format(resources.getString(R.string.block_confirmation), numbersString) ConfirmationDialog(this, question) { ensureBackgroundThread { 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 74f1df0f..db5e1c51 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -78,9 +78,9 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis override fun getItemCount() = conversations.size private fun askConfirmBlock() { - val numbers = TextUtils.join(", ", getSelectedItems().distinctBy { it.phoneNumber }.map { it.phoneNumber }) - val baseString = R.string.block_confirmation - val question = String.format(resources.getString(baseString), numbers) + val numbers = getSelectedItems().distinctBy { it.phoneNumber }.map { it.phoneNumber } + val numbersString = TextUtils.join(", ", numbers) + val question = String.format(resources.getString(R.string.block_confirmation), numbersString) ConfirmationDialog(activity, question) { blockNumbers() From 25bc8660bf3e5a3395f3ab4a4384952a6e5949ee Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 23 May 2020 19:05:24 +0200 Subject: [PATCH 31/55] update version to 5.1.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 964ffebb..619df6f7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 29 - versionCode 6 - versionName "5.1.3" + versionCode 7 + versionName "5.1.4" setProperty("archivesBaseName", "sms-messenger") } From d328fd8c5a7bfbcf551b942cda52cff1a7d1b4f4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 23 May 2020 19:05:30 +0200 Subject: [PATCH 32/55] updating changelog --- CHANGELOG.md | 8 ++++++++ fastlane/metadata/android/en-US/changelogs/7.txt | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/7.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b9afde..b0deb926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========== +Version 5.1.4 *(2020-05-23)* +---------------------------- + + * Improved the performance at checking if a number is blocked + * Use capital letters at sentences at writing a message + * Allow blocking numbers from the main screen + * Fixed a glitch with adding new people to a conversation + Version 5.1.3 *(2020-05-20)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/7.txt b/fastlane/metadata/android/en-US/changelogs/7.txt new file mode 100644 index 00000000..58162fbd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/7.txt @@ -0,0 +1,4 @@ + * Improved the performance at checking if a number is blocked + * Use capital letters at sentences at writing a message + * Allow blocking numbers from the main screen + * Fixed a glitch with adding new people to a conversation From e80f3ed84aa716a7c5c4203e57240750e173dd2e Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 24 May 2020 19:17:24 +0200 Subject: [PATCH 33/55] Create strings.xml --- app/src/main/res/values-de/strings.xml | 71 ++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 app/src/main/res/values-de/strings.xml diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..6034e936 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,71 @@ + + Schlichter SMS Messenger + SMS Messenger + schreibe eine Nachricht… + Nachricht wurde noch nicht gesendet + füge eine Person hinzu + Anhang + keine gespeicherten Chats gefunden + einen neuen Chat beginnen + + + neuer Chat + Füge einen Kontakt oder eine Nummer hinzu… + Vorschläge + + + Empfangene SMS + neue Nachricht + markiere als gelesen + + + Möchtest du wirklich alle Nachrichten dieses Chat löschen? + + + + %d Chat + %d Chats + + + + + %d Nachricht + %d Nachrichten + + + + 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. + + Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. + + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From d905a9a8a3cc00fb836230941b6b0ba3748b7a4f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 24 May 2020 21:29:39 +0200 Subject: [PATCH 34/55] deleting the mdpi resolution images --- app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1508 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_amber.png | Bin 1329 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_blue.png | Bin 1459 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_blue_grey.png | Bin 1531 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_brown.png | Bin 1556 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_cyan.png | Bin 1411 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_deep_orange.png | Bin 1424 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_deep_purple.png | Bin 1492 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_foreground.png | Bin 1196 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_green.png | Bin 1515 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_grey_black.png | Bin 977 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_indigo.png | Bin 1507 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_light_blue.png | Bin 1427 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_light_green.png | Bin 1532 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_lime.png | Bin 1448 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_pink.png | Bin 1481 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_purple.png | Bin 1497 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher_red.png | Bin 1438 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_teal.png | Bin 1444 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_yellow.png | Bin 1423 -> 0 bytes 20 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_amber.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_blue.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_brown.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_green.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_lime.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_pink.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_purple.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_red.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_teal.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 4b3ee26333b123f4b5963e8632b79cb6e86f3784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1508 zcmVeLk*!4=z||GEtQ(u23oBJUuxeBAy?Tc~f3SlHF>}@#2jUde;ek-Qa80VknfHpXVq9ZuN8c;kTiZ^4^1;MPNCRQA4{JQhLQzdS4WwyRkfyo2feI}L>LA(g+k6hMs1t! z6@%ROs$_T>rH7`7u`J{PHbo4ErH3Z3O0IJtoyOP#-=TOed~QCWXe$_W#=H2&ZBDrM z!2Uc39@?1qf?~)1JO|v(4#@SsEs)z- z5+k`X6agxp^j$lzLF;+0B>^Hd*9@)~*c&$Nq+!EO|2#v44W)^==s_$ZkpDMWBO`{2 zRfkvgpd>&krh=>|=1-rKIoAXJPJTrnu@o)u{7R(x@c^Exp>0YL--7jvi6BS($f|at zYc~g4MvX)Zs=@Po;`2dF%zZ5h&<5iwKo`W@w-avFi84iz%6z7M>M?@Dt+D7aG z)}8B2f3?T+xFJ%`v1}QQ8l2WJ;F>CQnIk$oN%qH&vHrM%WdA`d6SR$po+n%qRVh#- zx&Q?enYrto=n?F^#Ti!tiG$ppd5_De>XVP70uge*pCfbjE%ekx{i)*G?Juo4&aH(7 zRVOkPnGaRHpv@_!&%Vv{$sOniA&~duQ**eotV%%R02dKPoE{*B8ALR>8)upP=qYkP ze?gFqtR9FkvicYoD$5p~UpI>r?IFDNS(v)OJ|}}?Vyod0 zH?(G;%JAo}ME<_HG)V~$h%oTj39dWYTr+dW;v7L3sw|Hh#naJ4#L#C)IpSvYe3!Fn z^&e2x$z4lB-XZl7DuhvBTdPN!-Sb_lqfFbHZeX<1w&Xn_jOHSAdy$740svMFazB}8 zo8xebK-~8oPaq5d+t$>$8vq{ypx6^1#@HpAK1KNzX~;cciqQAz5q8yj^CfOUJ-A)+ z)jKCd7|{jxxve&C2=$uPvgb1gKAl@4T-KVyPMeg^XViz%MYln>0UHaNlvhs(%phC^ z&MS*Etrf9NP%Oz`4RSf!3(#gLR?M2F5bhw1=Pbq+#`BNxf5(62dK(7sD0=q*0000< KMNUMnLSTXtYOvD) diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png deleted file mode 100644 index 7986a794b159429db8942849c6031d12d6238d48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 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 N002ovPDHLkV1ne+uX+Fg diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png deleted file mode 100644 index d15df02bae759c62414f6390c57fa4576835e880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1531 zcmV8 z1TZp2+aM-ec~Fxk8e%lY_=ZWN5o4kdh=$S_7%CCysvu-VN~r-GMIk1nv06w>kwDo$ z*x7r0*q?THW_M?Hr>zfs$?VSFd(J)InS0OuIkUhW%r3~$)>PHiD!g@)Py;~=!I+=4 zG7ia?1!MH6oVW;0i#uhqWCxl%I;$0ljUZkNpou{4eDVyA0vG_(5nbRwpm*0;DfWwY zprymt#7tYkypD*9YKNH_M2CpD`&jSpfnwUQZMa$WEh;Oc?Eu<}F_;JbSd6;@+U`qs zlw5X%TiShHLQo$Ome}KF35$iGmur_b1V_#f4_Q^R)B`J3)l;E(dx+@S;`vzzGxvq` ziA{r=7AYiK(1A7TmMT)DAB0uT(6b1}Y1T#C_u9@I`NTxN%9X0>nHBN?Kv+eJ^siJ^ zPd>4{4pb=Ko>?KE0%28!;_b;Nk~4@~+I?L_^t$t`?16}u)Ydm#&lT9FG0?2~7AXq- zN(4jqdE9P1P<nAwrbv~4Mk zPB5=)?&z$ZT9gq3io`~%8?zsW&f@d^2Th-p9S9QG{M-htex%V*$5KKf(fa^EM5IV; z1n^OsbA|@-TC4lJP$Ytho57q<&@zY+Hko-+$aW&RZ8vd1Rb2oKL6WwU{z%}7)sLd} zv7F+zP^iARtbPTi#Z(X6oh>2xqE(=J-1cBVG!dsUrPxpW%)Yv&3oESKR z&wBPjmNV)z zo4LfwR#bAyN&GW@6}N83a@I5Rz|_=a=60It$n;S&B?D%LloIiH93y}IjcuRo%pX^T z{;5AR<}_X4fFk)ryQ#upD2#*O9>ec{T*A#z7`m<_E+u4KLb6N}1%Sjig8>F4GgwOK z@i=0-j$kO9mpn5w$8{~I1A*RMV{6(w4*^(jP)>hjG>9`l|AOtidocd*H9I~Ri^GAh zdNY#2hE;`#yTN2|ARD1@1UvTbga5?I(zg>9!Qk%fGQ*KFnI-lcl$jCJbx0|3>Zfzq z^5(nfKmNmvkq6)pXnRg&7n-i?u^4wL3OznGt-{QBr~6|>qfv~GU71dz1~53n9Pcu# zGfnRNd13fk?Xrd-Ku=CBzjplwu20+qX6~s20GN4eKWL^L zm7boUW^UZ~1++bH~pzj5rD<1a))}t&m3Q$YqrS+M_;qr?Fmk- zf`=L0ZMH~Rf#WZ_S+cu;6H#U!0HL3CUCZ9v*u}K`)gUJI8fLBrQ6hW5e3gjCSjf?U hj5_*PgFBdQ{0C`1r-r{3yuSbd002ovPDHLkV1hL+);s_J diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png deleted file mode 100644 index 5132d9ba2612a4de176fcbf9f4b587158e98a32e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1556 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 RCinmV002ovPDHLkV1h3{w$K0o diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png deleted file mode 100644 index 172816af10a64b5accc0a723dfb1e6551d0edcae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmV;?11|iDP)1)f46Z^@JCBXINp2O$!#l>^gfAou{BwvfCf zr>5_w(9A;4|>st3Aj6`Ptc7k;~;oSa^7N5DN)U01j)()=uOhVBYIc2_d|`S{IV!`A|HM z!7*z!)CRDK$0K$sm11ja3tiW}I(LLD%WQ9Nv$(kE<#h>z<2S3JHh?*=jthkX`Fy_V zQII5wLZRSCWe!^a_TG*Fe}Qf%Ek#kdy}czKj|0Z^333Wq)2Li7)8F6Em?wH znH0&k2NQ1O-x#_vxB}HvXvB||{r!E`*Vmg~1Ck`Mv$Mm>%8DPg5#Se82QcWzLT_&` z0|Ntr1Q3lz{i->pqMOt?k0^>F?(gs0y$@KjX_0>Qfkp^Hu~_t_6NyCV>gsx}OGnrP z$oWy++uLJfW5buTXf(>%*%^sM!k3-{^41S~0M~vjjE|2qJw5Gf4aDPdVzHPXH*Ux} zH74ntHITGO+xLMhj7_4g5REs;5(ZbGI)DmB4%${^G8syxy8U>Htu!guJp3L8DK}WX zt?N3Prg46L&eGCSqjgo4*wmgphk!p0?Jv$kcBrb#?(Qz>bQ)Dvd47II(=;?qL)Z2H zM4hBksi0{Z<#HKSRU45PKmwOVY{7FvqwBgjK0X%1!^5pg?vLsbx8Rsk)&`)es#soL z7P2h2vO4j_O90@I)XTCgZfyRudN{ z7vGiZjwoz3LPwVtq5Z|(Gy#;^+f`mq6F_<0LPuY4*wL|9Om=kiC7&HZU9%qHV}}g` zuf6F0N&pw#VSZ{b1bj5x^B5<{H~Fc-JDR~iY!RXl`;xnq00000NkvXXu0mjfo=wAa diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png deleted file mode 100644 index b3b2ec4abee3c80284dd881761731a3ed58972cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1507 zcmV<91swW`P)@us_z;QWgqA+lTg{Pz#}Hg;pq9A_zrd;zQK<(%Mw>V+(@a8uC#8BC%MFM&oX? zo839551UPPXJ%(-b|>b=4;E(bJ@=mT&AIoUd(U0qF=iIzZFj9|AUImB=voyNEP?RC zlosU<7&lo>4u-qR2Y~ImR~m~Z5C|UhE4tPwge@S{5>RRkJbGkY%WA$P6#>^iXQ6k zdgrp6W{Ml(Kz&Qd$7zd0deHBNDu&prb+(88GcM~H! zhWb7l%O{(c!1C2U%qyQ$(g{M1H|9Bnpm#JnzWM5f-4E=RUpOYRub#2;1x?w&fg{SSrIHnA|tJ zOv8$06;M@ggE+I`%Jut*L=)yp!B|4k16E6{X4TomI&U)mxz&rY@3R+BG0!&G7L13H zaeV$&H-7EDkzGM3^Rc=gz$?Z!rq8&l?r<#>>9$hPet0XEKQ-SYbFFcEIEqbgw1UOL z!%WW`Ber=CknFYUSXBv?PuMO9o?w3YEci5ru*H7Q!nP~|f#5;E01Y{NH+&Qk@#JR( zk)(-)01biQL4Rgh)*MiDtr3c|=={rX*YMq;KfvrnIyV#r*z?vJyu5z7sZJybFhGh5 z03ZU9t~CPqHZ7AyKnPo$t}T&h9QPl@bACamARYg$)`cO1E2Li#->U@WhnM8U{5KtNjj#j73Cq0ll209-O zr+>bTufIPJ=3<8su;=YHXl$s?E1UL&0<8+bB_MMMDOlo0acQZBiut7|ateSb72Tae zBncLMawVE-DZDW6V9daVx@Fi1XHE4G$RM%zqC??#ygNuBZcmAm-# zi!-+SD-k)B`JT0mvYKoo)|%a>3Li$|_^Is@{`~7-j7H)}BpG^=p)-S7AcBcs$}mYA z&zLkmk3Yca0;Ec$yjDu`7fT^*#kkRv0PY?Na$c@ zoH=_9+uv+Md&i?QUId-}-5;3F>XuuHgrbLhtgg?@Ot1hSe*81yu^6sgADK>D%@7%5 z_F3kJEF;&Q>mB!=tlAnO!p6+<;d^5kxgP^is#8avU9?E zYH$81AkrT0dA~7Nwe9ZbZenBy1ii*`QdAHXypeSb5%k^Tu^o0YMWxrL(-R`-i^gbE zQR#I6xO!ptgW<%;OCo4D)=iryMA}FAzZdfv54gM|3)HuS6kwk*Z|a#RM8-h$Nx1vH z{Z5;BcF9*P2@!NMYoY!=cb9ygUbDI-k-BD;6FPB|RgiK5&o8>cdZ`@=0b&I7h{!2Q zYR8Ow8@HI2zZ$TvR}r(H2n&GJ8CFCYQow_$!-#i(HF%7f#{brOpBiGi%6k9+002ov JPDHLkV1gp+!FvDz diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png deleted file mode 100644 index 6e1df4b4a65e97af572459f78bad8264fc6f6f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1427 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png deleted file mode 100644 index 21ddb23930e7cb38588871e79ea51bfe0470800d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1438 zcmV;P1!4M$P)^)JXgTgv3{J;KL{2fSPdWA$Dz9ATUZXh!RLmHX^a{%-aL8 zYwwr6&IVt2q?LB(^LaEg@4WNQ0$_w?0Q6oV`ZT4wG@{)_qMZO>FfSU5i0|3#mG>k-Ch%sN)>M1lEiG(`B;VU3I-WWTdV4gA;7f%glvn#cV))eq(clXxT zj*b|B!9d8>kJ-Fw4)4!oK6n-KoIbn8QUn3f8-QLq6qVONuMmAT4QYtfFAPn*Q!uphE7zrL}dX*qMd$DH=RR6=o}jIQ6o4MnRk@l9bJifz|2tjystW> zY0z3)8tu{%WdR2Bg7R@Te|zm3US7K7YYOS@?fCxsb+qo<<&UKW8qvGbds%>De&wf; zwmp0BjS&6>Y}o>R^JYKYID(kVp_u;#XxhA=HLx`r#n!0zwy{xQDd$V?WzJ6$i8Pp3 zo5H9PwMLYA^+h_JE`62-oCG8T4F#8iME><_Z{t8TQyH49nl&15cjKtpQT9lcf+`mA z@##}!&Yc51Hb(~TReo2QQ3>4Am@oMa6&6hs|6IL_<#-%&X$k!46Ie>Hlz>v7UFOpB znK@8$rIi9p2~{XSE-iUaA!cSxyXh)mUm}rB3UQl(V=fI?+e7ZrBm8~g0t#>5_|e=L zi0&M+1cU7xnWl|{*-=0x{o?X6vJ(?nn4S*Aou~&&sc~zX&2sLYo0|c1%vPKE^VCoZ z|2}wt)QJ;Vn40=xPHWoyY?Cz(etBj|B!EAOVZ<@nsf(T}QtbhFYORYPCn*Q7VOy-06{{7Ej zp0eg`muvz>c}Er(VvLA>vs$MB*Tf2#&mKr7C+n>c*d^b3MKBOElp1rh zHf{*?n$@=mW(Lt6rPR37CRGmtzvz}go2LloRS?ZEaF2;@T74V8*pOchJ}K43L=m+X sJ{0dO>)BYpF*2mk;807*qoM6N<$f|84s4*&oF diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png deleted file mode 100644 index f209937b2b89c6e21f0d06e4e55a7cdb4141a0b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1444 zcmV;V1zY-wP)WC?pM%@)6^M#ssAT*3Sgcm^6`?r4pf3pNxs!lG+dwAoKxavJpi2uq~D%K1#I$_4z1tKqn$ieDKBZUW5!!Dt0wC zp;SAHMV{o`p$62O)YT3V>g{nWkQwV`-1Z+c!Jv=h6wiG#sNuBy2W*tO+u z)bvgitBOL-Erf1lq@E8C4LVixIX1FAP&Osx0TioH(>vK7D08ajY=AXvCZBu)idFcl z+MKFncj8@*P59JXMJMGIibd4b4rFs|dmq@{I3LtG6dBz&v&7Gm`yODL&$;uw!W7NL zYkxBkweeda01+=c)IAP=g?kOwd({(Rp8`t%t+{Pi(0Fh=pX~XB^{))Q_q?j9( z<>izrA84IfXv1y10XsL(18H!pOhk%u*|ZF%X=8*mSR9iW?*rDV($(zz{rR)J^V1J# zTLSLkQ;K)jtYhQSCo&7o(N%XMU?`=n|D zusGTn5C|Bf>v;!d$+Fj$ujJL`EAru-*>0{*A7_Nr5eOKGO;OSZYGyCYy&1_=U7X7W z#(YART3jt8d%#rHITjYuil=f{PV@w-8n^(d1}I}L zxF66nN=m3Iub?pc*7vU{@w*o=O~5x6iBgQiS_&5{)|q2T`Ha)MWag@0cK7_FP6+qgpg^ z)8zcsE4*^_>s)?yD)nJ}OfzH0@Rc0!nkpQK4D(6X&vb|XU?4Kg?RcEH*2J|&i?)UZ zlKf2}Z;B8%O=4!8fyl5kc@e>oV0Huc9l6ZzttWu>+2qroJNnME_4v2^IneLL=6rE7 zJsF%it0>h1VrxJu2BQ(0JKFi`x2}Ts1n!|)(%)nTek)7dnf_Xf5HsVLT66ruSsp+5 zK8JgLoka4|$^JuK>2K}lb&)1ePp76;vIdBnn0p&@}pfz_RL(Uw};hFK9-S6SIW93&xm&RAKsCz z(0TC_yS53TJ5$OBhPR`IJaHPcf0I)MX9ErfBgjbo6d7?EgXeRd5#(kNIuoPzp`#e( zk51xnYRBx~z(;LExhi@)BeRZ}_GTn~wNBZu762=WyNCUUTiuFy8v~)<9#+?Whf?!_ znz8pq=?UpX>-E{9O*RzwnAK}fSZkA$pjzxEDK{woLARDtXCowvs1R@pLkFkspxX|K yzZ%@u)xbO;kv+HpTm~~t_*PN>YH$ZrjsF2-uf3%$)`&6zzqqZ0HWegs1Q<`2&q4O;fK|VG)JUBWGE$4XbNdvq&Q9!dv|9Z z2ggqAU9Y|Nrn&GWTf6&xGxMHj=9`&s4g8PYg+y5yCt=!sLqjIb0WqatYxV(vVMvaO z50$9JcrKfj^H5Q>*|C82%t$f@bxvTMhHw;+uHX_Zf-*zsn=Z_$#MsmfztIz>-dZ_dxOQ$y&6i0ls%vciewb257-u^( zoHE6ji=I3H$haxSoShj?g(}sG(}T%m_o2Sts}MQc9=VVprKsi(za{#>EXC{EeARw{mNCE&9@N@xC1wZ44 zq8{-JvA!(Iao&e~?`trJK83`e@06`C=oX-U`v~~=$9hxuCZ~7m4W1rw?i?9~Hh%JJ zzrz0Pb2tYrTj~j$Q$rgz1*| z^9|eCZnOH|gVq0T2gE&>jq}gmjg;mQn2iljZW)MU+Wl+ZVKikKg^cBC5AE>z(jHs(G=(Bh~mx3=Hc z40;#llm-1o*i@l*3a}TyhRXj8I;((o0V;qlKmyPp00BX8bChs10BC>;)HdL(B6tXq zduU&4C?GL5x8&Y_`8o;jE{)Z%ZPgKO?ly|qkHO+{Q=y%%*#K@N#_!i8gFRt~q9;J3 z={A$j8jANmgR?Xp4Yd}aC=>P1JV(m%nUiU6aRS-~so^~O0c*2o;VezzS&@e@z5mp_ z=dA7<_!XHlMaEE*nb2^5xrkD!2)*{_j`8#Zi4B4H=7xL|TU}%G_eox^e=bk6h?N$i z=GPP=`trV${%QBXXyastr~I;Wu3~j>zSAHu-FtHWTqAp6Zge@faslAo`sXoI5VsJN5aiNPdVNQGf|ymYjZ^zONv{Kd9AC&UKVEqo Date: Sat, 30 May 2020 17:18:39 +0200 Subject: [PATCH 35/55] hide the number blocking button below Android 7 --- .../smsmessenger/adapters/ConversationsAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) 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 db5e1c51..7dc263ab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.helpers.KEY_PHONE import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R @@ -37,6 +38,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis override fun prepareActionMode(menu: Menu) { menu.apply { findItem(R.id.cab_add_number_to_contact).isVisible = isOneItemSelected() && getSelectedItems().firstOrNull()?.isGroupConversation == false + findItem(R.id.cab_block_number).isVisible = isNougatPlus() } } From 09892e0078faffa90f2d7d59ded53e983c9640bd Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 17:20:29 +0200 Subject: [PATCH 36/55] catch and show exceptions thrown at adding message attachments --- .../smsmessenger/activities/ThreadActivity.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 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 5c69142b..13813bef 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -514,9 +514,13 @@ class ThreadActivity : SimpleActivity() { if (attachmentUris.isNotEmpty()) { for (uri in attachmentUris) { - val byteArray = contentResolver.openInputStream(uri)?.readBytes() ?: continue - val mimeType = contentResolver.getType(uri) ?: continue - message.addMedia(byteArray, mimeType) + try { + val byteArray = contentResolver.openInputStream(uri)?.readBytes() ?: continue + val mimeType = contentResolver.getType(uri) ?: continue + message.addMedia(byteArray, mimeType) + } catch (e: Exception) { + showErrorToast(e) + } } } From 0bf7e12ee895992cf5601692b787953ccc0438d9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 17:29:00 +0200 Subject: [PATCH 37/55] renaming conversation to new_conversation layout --- .../smsmessenger/activities/NewConversationActivity.kt | 4 ++-- ...ctivity_conversation.xml => activity_new_conversation.xml} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename app/src/main/res/layout/{activity_conversation.xml => activity_new_conversation.xml} (100%) 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 4f5b1fea..bca2f70b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -18,7 +18,7 @@ import com.simplemobiletools.smsmessenger.extensions.config import com.simplemobiletools.smsmessenger.extensions.getSuggestedContacts import com.simplemobiletools.smsmessenger.extensions.getThreadId import com.simplemobiletools.smsmessenger.helpers.* -import kotlinx.android.synthetic.main.activity_conversation.* +import kotlinx.android.synthetic.main.activity_new_conversation.* import kotlinx.android.synthetic.main.item_suggested_contact.view.* import java.net.URLDecoder import java.util.* @@ -30,7 +30,7 @@ class NewConversationActivity : SimpleActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_conversation) + setContentView(R.layout.activity_new_conversation) title = getString(R.string.new_conversation) updateTextColors(new_conversation_holder) diff --git a/app/src/main/res/layout/activity_conversation.xml b/app/src/main/res/layout/activity_new_conversation.xml similarity index 100% rename from app/src/main/res/layout/activity_conversation.xml rename to app/src/main/res/layout/activity_new_conversation.xml index 79704e5d..f76e807f 100644 --- a/app/src/main/res/layout/activity_conversation.xml +++ b/app/src/main/res/layout/activity_new_conversation.xml @@ -42,12 +42,12 @@ android:id="@+id/no_contacts_placeholder" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_below="@+id/message_divider_two" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/bigger_margin" android:alpha="0.8" android:gravity="center" android:paddingLeft="@dimen/activity_margin" - android:layout_below="@+id/message_divider_two" android:paddingRight="@dimen/activity_margin" android:text="@string/no_access_to_contacts" android:textSize="@dimen/bigger_text_size" From 1950893b5808c32a999409a77d7cd44fdb9e98c8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 17:32:58 +0200 Subject: [PATCH 38/55] fix #40, allow adding newlines with Enter --- app/src/main/res/layout/activity_thread.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index 0a306385..33ec03ed 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -161,7 +161,7 @@ android:background="@android:color/transparent" android:gravity="center_vertical" android:hint="@string/type_a_message" - android:inputType="textCapSentences" + android:inputType="textCapSentences|textMultiLine" android:minHeight="@dimen/normal_icon_size" /> Date: Sat, 30 May 2020 17:35:34 +0200 Subject: [PATCH 39/55] fix #47, properly decode phone numbers at Reply via SMS intent --- .../smsmessenger/services/HeadlessSmsSendService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/services/HeadlessSmsSendService.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/services/HeadlessSmsSendService.kt index c5cbb81b..eaeba8fb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/services/HeadlessSmsSendService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/services/HeadlessSmsSendService.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.smsmessenger.services import android.app.Service import android.content.Intent +import android.net.Uri import com.klinker.android.send_message.Settings import com.klinker.android.send_message.Transaction import com.simplemobiletools.smsmessenger.extensions.getThreadId @@ -15,7 +16,7 @@ class HeadlessSmsSendService : Service() { return START_NOT_STICKY } - val number = intent.dataString!!.removePrefix("sms:").removePrefix("smsto:").removePrefix("mms").removePrefix("mmsto:").trim() + val number = Uri.decode(intent.dataString!!.removePrefix("sms:").removePrefix("smsto:").removePrefix("mms").removePrefix("mmsto:").trim()) val text = intent.getStringExtra(Intent.EXTRA_TEXT) val settings = Settings() settings.useSystemSending = true From f638fa06f29c1ea235771cd561a381489a33ad9e Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 18:04:34 +0200 Subject: [PATCH 40/55] creating a room DB for storing conversations --- app/build.gradle | 7 ++++- .../smsmessenger/activities/MainActivity.kt | 2 +- .../adapters/ConversationsAdapter.kt | 12 ++++---- .../databases/MessagesDatabase.kt | 30 +++++++++++++++++++ .../smsmessenger/extensions/Context.kt | 8 ++++- .../interfaces/ConversationsDao.kt | 6 ++++ .../smsmessenger/models/Conversation.kt | 18 +++++++++-- 7 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt diff --git a/app/build.gradle b/app/build.gradle index 619df6f7..04150cd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() @@ -56,8 +57,12 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.28.19' + implementation 'com.simplemobiletools:commons:5.28.24' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' + + kapt "androidx.room:room-compiler:2.2.5" + implementation "androidx.room:room-runtime:2.2.5" + annotationProcessor "androidx.room:room-compiler:2.2.5" } 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 01c694b9..bc734d66 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -168,7 +168,7 @@ class MainActivity : SimpleActivity() { ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { Intent(this, ThreadActivity::class.java).apply { - putExtra(THREAD_ID, (it as Conversation).id) + putExtra(THREAD_ID, (it as Conversation).system_id) putExtra(THREAD_TITLE, it.title) startActivity(this) } 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 7dc263ab..60348d67 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -59,9 +59,9 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis override fun getIsItemSelectable(position: Int) = true - override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.id + override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.system_id - override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.id == key } + override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.system_id == key } override fun onActionModeCreated() {} @@ -129,10 +129,10 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis return } - val conversationsToRemove = conversations.filter { selectedKeys.contains(it.id) } as ArrayList + val conversationsToRemove = conversations.filter { selectedKeys.contains(it.system_id) } as ArrayList val positions = getSelectedItemPositions() conversationsToRemove.forEach { - activity.deleteConversation(it.id) + activity.deleteConversation(it.system_id) } conversations.removeAll(conversationsToRemove) @@ -164,7 +164,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis } } - private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.id) } as ArrayList + private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.system_id) } as ArrayList override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) @@ -175,7 +175,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis private fun setupView(view: View, conversation: Conversation) { view.apply { - conversation_frame.isSelected = selectedKeys.contains(conversation.id) + conversation_frame.isSelected = selectedKeys.contains(conversation.system_id) conversation_address.text = conversation.title conversation_body_short.text = conversation.snippet diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt new file mode 100644 index 00000000..a514dd12 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -0,0 +1,30 @@ +package com.simplemobiletools.smsmessenger.databases + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao +import com.simplemobiletools.smsmessenger.models.Conversation + +@Database(entities = [(Conversation::class)], version = 1) +abstract class MessagesDatabase : RoomDatabase() { + + abstract fun ConversationsDao(): ConversationsDao + + companion object { + private var db: MessagesDatabase? = null + + fun getInstance(context: Context): MessagesDatabase { + if (db == null) { + synchronized(MessagesDatabase::class) { + if (db == null) { + db = Room.databaseBuilder(context.applicationContext, MessagesDatabase::class.java, "conversations.db") + .build() + } + } + } + return db!! + } + } +} 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 a28dd4ba..0ec27820 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -22,7 +22,9 @@ 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.databases.MessagesDatabase import com.simplemobiletools.smsmessenger.helpers.* +import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver import java.util.* @@ -30,6 +32,10 @@ import kotlin.collections.ArrayList val Context.config: Config get() = Config.newInstance(applicationContext) +fun Context.getMessagessDB() = MessagesDatabase.getInstance(this) + +val Context.conversationsDB: ConversationsDao get() = getMessagessDB().ConversationsDao() + fun Context.getMessages(threadId: Int): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( @@ -215,7 +221,7 @@ fun Context.getConversations(): ArrayList { val photoUri = if (phoneNumbers.size == 1) simpleContactHelper.getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" val isGroupConversation = phoneNumbers.size > 1 val read = cursor.getIntValue(Threads.READ) == 1 - val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first()) + val conversation = Conversation(0, id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first()) conversations.add(conversation) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt new file mode 100644 index 00000000..2546ff38 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -0,0 +1,6 @@ +package com.simplemobiletools.smsmessenger.interfaces + +import androidx.room.Dao + +@Dao +interface ConversationsDao diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index f5cf9da3..06872802 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -1,5 +1,19 @@ package com.simplemobiletools.smsmessenger.models +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity(tableName = "conversations", indices = [(Index(value = ["id"], unique = true))]) data class Conversation( - val id: Int, val snippet: String, val date: Int, val read: Boolean, var title: String, var photoUri: String, - val isGroupConversation: Boolean, val phoneNumber: String) + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "system_id") var system_id: Int, + @ColumnInfo(name = "snippet") var snippet: String, + @ColumnInfo(name = "date") var date: Int, + @ColumnInfo(name = "read") var read: Boolean, + @ColumnInfo(name = "title") var title: String, + @ColumnInfo(name = "photo_uri") var photoUri: String, + @ColumnInfo(name = "is_group_conversation") var isGroupConversation: Boolean, + @ColumnInfo(name = "phone_number") var phoneNumber: String +) From 7a7b1aab32785c94195e2043efbd593cd95d8a14 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 18:23:54 +0200 Subject: [PATCH 41/55] insert fetched conversations in db --- .../smsmessenger/extensions/Context.kt | 3 ++- .../smsmessenger/interfaces/ConversationsDao.kt | 15 ++++++++++++++- .../smsmessenger/models/Conversation.kt | 2 +- 3 files changed, 17 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 0ec27820..855e6c16 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -221,12 +221,13 @@ fun Context.getConversations(): ArrayList { val photoUri = if (phoneNumbers.size == 1) simpleContactHelper.getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" val isGroupConversation = phoneNumbers.size > 1 val read = cursor.getIntValue(Threads.READ) == 1 - val conversation = Conversation(0, id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first()) + val conversation = Conversation(null, id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first()) conversations.add(conversation) } conversations.sortByDescending { it.date } + conversationsDB.insertAll(conversations) return conversations } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt index 2546ff38..d901e965 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -1,6 +1,19 @@ package com.simplemobiletools.smsmessenger.interfaces import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.smsmessenger.models.Conversation @Dao -interface ConversationsDao +interface ConversationsDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(conversation: Conversation): Long + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertAll(conversations: List) + + @Query("SELECT * FROM conversations") + fun getAll(): List +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index 06872802..6d69dbf9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -5,7 +5,7 @@ import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey -@Entity(tableName = "conversations", indices = [(Index(value = ["id"], unique = true))]) +@Entity(tableName = "conversations", indices = [(Index(value = ["system_id"], unique = true))]) data class Conversation( @PrimaryKey(autoGenerate = true) var id: Long?, @ColumnInfo(name = "system_id") var system_id: Int, From a013c110ec987572ba72ccf4afccd1ba90ca8a1b Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 18:28:34 +0200 Subject: [PATCH 42/55] adding a helper function for updating conversations, if necessary --- .../smsmessenger/activities/MainActivity.kt | 28 ++++++++++++------- .../adapters/ConversationsAdapter.kt | 9 ++++++ 2 files changed, 27 insertions(+), 10 deletions(-) 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 bc734d66..834224a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -165,16 +165,7 @@ class MainActivity : SimpleActivity() { conversations_list.beVisibleIf(hasConversations) no_conversations_placeholder.beVisibleIf(!hasConversations) no_conversations_placeholder_2.beVisibleIf(!hasConversations) - - ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { - Intent(this, ThreadActivity::class.java).apply { - putExtra(THREAD_ID, (it as Conversation).system_id) - putExtra(THREAD_TITLE, it.title) - startActivity(this) - } - }.apply { - conversations_list.adapter = this - } + updateConversations(conversations) } } @@ -187,6 +178,23 @@ class MainActivity : SimpleActivity() { } } + private fun updateConversations(conversations: ArrayList) { + val currAdapter = conversations_list.adapter + if (currAdapter == null) { + ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { + Intent(this, ThreadActivity::class.java).apply { + putExtra(THREAD_ID, (it as Conversation).system_id) + putExtra(THREAD_TITLE, it.title) + startActivity(this) + } + }.apply { + conversations_list.adapter = this + } + } else { + (currAdapter as ConversationsAdapter).updateConversations(conversations) + } + } + private fun launchNewConversation() { Intent(this, NewConversationActivity::class.java).apply { startActivity(this) 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 60348d67..96cc40ab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -173,6 +173,15 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis } } + fun updateConversations(newConversations: ArrayList) { + val oldHashCode = conversations.hashCode() + val newHashCode = newConversations.hashCode() + if (newHashCode != oldHashCode) { + conversations = newConversations + notifyDataSetChanged() + } + } + private fun setupView(view: View, conversation: Conversation) { view.apply { conversation_frame.isSelected = selectedKeys.contains(conversation.system_id) From 2b3df2719b6d6f24adc850471f85ec67683135c7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 18:55:57 +0200 Subject: [PATCH 43/55] fix #8, load some cached messages instantly --- .../smsmessenger/activities/MainActivity.kt | 45 +++++++++++++------ .../smsmessenger/extensions/ArrayList.kt | 3 ++ .../smsmessenger/extensions/Context.kt | 1 - .../smsmessenger/models/Conversation.kt | 6 ++- 4 files changed, 39 insertions(+), 16 deletions(-) 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 834224a0..ba716942 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -19,6 +19,7 @@ import com.simplemobiletools.smsmessenger.BuildConfig import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter import com.simplemobiletools.smsmessenger.extensions.config +import com.simplemobiletools.smsmessenger.extensions.conversationsDB import com.simplemobiletools.smsmessenger.extensions.getConversations import com.simplemobiletools.smsmessenger.helpers.THREAD_ID import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE @@ -144,8 +145,29 @@ class MainActivity : SimpleActivity() { private fun initMessenger() { storeStateVariables() - val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() + getCachedConversations() + no_conversations_placeholder_2.setOnClickListener { + launchNewConversation() + } + + conversations_fab.setOnClickListener { + launchNewConversation() + } + } + + private fun getCachedConversations() { + ensureBackgroundThread { + val conversations = conversationsDB.getAll().toMutableList() as ArrayList + runOnUiThread { + setupConversations(conversations) + getNewConversations() + } + } + } + + private fun getNewConversations() { + val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() ensureBackgroundThread { val conversations = getConversations() @@ -161,24 +183,19 @@ class MainActivity : SimpleActivity() { } runOnUiThread { - val hasConversations = conversations.isNotEmpty() - conversations_list.beVisibleIf(hasConversations) - no_conversations_placeholder.beVisibleIf(!hasConversations) - no_conversations_placeholder_2.beVisibleIf(!hasConversations) - updateConversations(conversations) + setupConversations(conversations) } - } - no_conversations_placeholder_2.setOnClickListener { - launchNewConversation() - } - - conversations_fab.setOnClickListener { - launchNewConversation() + conversationsDB.insertAll(conversations) } } - private fun updateConversations(conversations: ArrayList) { + private fun setupConversations(conversations: ArrayList) { + val hasConversations = conversations.isNotEmpty() + conversations_list.beVisibleIf(hasConversations) + no_conversations_placeholder.beVisibleIf(!hasConversations) + no_conversations_placeholder_2.beVisibleIf(!hasConversations) + val currAdapter = conversations_list.adapter if (currAdapter == null) { ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { 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 dfaf3202..0ff90913 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt @@ -2,5 +2,8 @@ package com.simplemobiletools.smsmessenger.extensions import android.text.TextUtils import com.simplemobiletools.commons.models.SimpleContact +import com.simplemobiletools.smsmessenger.models.Conversation fun ArrayList.getThreadTitle() = TextUtils.join(", ", map { it.name }.toTypedArray()) + +fun ArrayList.getHashToCompare() = map { it.getStringToCompare() }.hashCode() 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 855e6c16..164c3328 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -227,7 +227,6 @@ fun Context.getConversations(): ArrayList { } conversations.sortByDescending { it.date } - conversationsDB.insertAll(conversations) return conversations } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index 6d69dbf9..f1636025 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -16,4 +16,8 @@ data class Conversation( @ColumnInfo(name = "photo_uri") var photoUri: String, @ColumnInfo(name = "is_group_conversation") var isGroupConversation: Boolean, @ColumnInfo(name = "phone_number") var phoneNumber: String -) +) { + fun getStringToCompare(): String { + return copy(id = 0).toString() + } +} From 35c205605dc2a4f95dcf94a7a7a456de7f329f11 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 20:01:09 +0200 Subject: [PATCH 44/55] properly handle inserting and deleting threads from local db --- .../smsmessenger/activities/MainActivity.kt | 26 ++++++++++++++++--- .../smsmessenger/activities/ThreadActivity.kt | 10 ++++--- .../smsmessenger/extensions/Context.kt | 6 +++-- .../interfaces/ConversationsDao.kt | 11 +++++--- 4 files changed, 40 insertions(+), 13 deletions(-) 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 ba716942..3fa20029 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -158,15 +158,15 @@ class MainActivity : SimpleActivity() { private fun getCachedConversations() { ensureBackgroundThread { - val conversations = conversationsDB.getAll().toMutableList() as ArrayList + val conversations = conversationsDB.getAll().sortedByDescending { it.date }.toMutableList() as ArrayList runOnUiThread { setupConversations(conversations) - getNewConversations() + getNewConversations(conversations) } } } - private fun getNewConversations() { + private fun getNewConversations(cachedConversations: ArrayList) { val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() ensureBackgroundThread { val conversations = getConversations() @@ -186,7 +186,25 @@ class MainActivity : SimpleActivity() { setupConversations(conversations) } - conversationsDB.insertAll(conversations) + conversations.forEach { clonedConversation -> + if (!cachedConversations.map { it.system_id }.contains(clonedConversation.system_id)) { + conversationsDB.insertOrUpdate(clonedConversation) + cachedConversations.add(clonedConversation) + } + } + + cachedConversations.forEach { cachedConversation -> + if (!conversations.map { it.system_id }.contains(cachedConversation.system_id)) { + conversationsDB.delete(cachedConversation.id!!) + } + } + + cachedConversations.forEach { cachedConversation -> + val conv = conversations.firstOrNull { it.system_id == cachedConversation.system_id && it.getStringToCompare() != cachedConversation.getStringToCompare() } + if (conv != null) { + conversationsDB.insertOrUpdate(conv) + } + } } } 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 13813bef..21c789f9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -343,9 +343,13 @@ class ThreadActivity : SimpleActivity() { private fun askConfirmDelete() { ConfirmationDialog(this, getString(R.string.delete_whole_conversation_confirmation)) { - deleteConversation(threadId) - refreshMessages() - finish() + ensureBackgroundThread { + deleteConversation(threadId) + runOnUiThread { + refreshMessages() + finish() + } + } } } 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 164c3328..d5a2fc17 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -462,10 +462,12 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L return newUri?.lastPathSegment?.toInt() ?: 0 } -fun Context.deleteConversation(id: Int) { +fun Context.deleteConversation(threadId: Int) { + conversationsDB.deleteThreadId(threadId.toLong()) + var uri = Sms.CONTENT_URI val selection = "${Sms.THREAD_ID} = ?" - val selectionArgs = arrayOf(id.toString()) + val selectionArgs = arrayOf(threadId.toString()) contentResolver.delete(uri, selection, selectionArgs) uri = Mms.CONTENT_URI diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt index d901e965..6cc15187 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -9,11 +9,14 @@ import com.simplemobiletools.smsmessenger.models.Conversation @Dao interface ConversationsDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insert(conversation: Conversation): Long - - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertAll(conversations: List) + fun insertOrUpdate(conversation: Conversation): Long @Query("SELECT * FROM conversations") fun getAll(): List + + @Query("DELETE FROM conversations WHERE id = :id") + fun delete(id: Long) + + @Query("DELETE FROM conversations WHERE system_id = :threadId") + fun deleteThreadId(threadId: Long) } From 661798cff4b0050d7aa4b56322d140523cc9c26d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 20:03:13 +0200 Subject: [PATCH 45/55] renaming system_id to thread_id --- .../smsmessenger/activities/MainActivity.kt | 8 ++++---- .../smsmessenger/adapters/ConversationsAdapter.kt | 12 ++++++------ .../smsmessenger/interfaces/ConversationsDao.kt | 2 +- .../smsmessenger/models/Conversation.kt | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) 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 3fa20029..68842dfc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -187,20 +187,20 @@ class MainActivity : SimpleActivity() { } conversations.forEach { clonedConversation -> - if (!cachedConversations.map { it.system_id }.contains(clonedConversation.system_id)) { + if (!cachedConversations.map { it.thread_id }.contains(clonedConversation.thread_id)) { conversationsDB.insertOrUpdate(clonedConversation) cachedConversations.add(clonedConversation) } } cachedConversations.forEach { cachedConversation -> - if (!conversations.map { it.system_id }.contains(cachedConversation.system_id)) { + if (!conversations.map { it.thread_id }.contains(cachedConversation.thread_id)) { conversationsDB.delete(cachedConversation.id!!) } } cachedConversations.forEach { cachedConversation -> - val conv = conversations.firstOrNull { it.system_id == cachedConversation.system_id && it.getStringToCompare() != cachedConversation.getStringToCompare() } + val conv = conversations.firstOrNull { it.thread_id == cachedConversation.thread_id && it.getStringToCompare() != cachedConversation.getStringToCompare() } if (conv != null) { conversationsDB.insertOrUpdate(conv) } @@ -218,7 +218,7 @@ class MainActivity : SimpleActivity() { if (currAdapter == null) { ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { Intent(this, ThreadActivity::class.java).apply { - putExtra(THREAD_ID, (it as Conversation).system_id) + putExtra(THREAD_ID, (it as Conversation).thread_id) putExtra(THREAD_TITLE, it.title) startActivity(this) } 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 96cc40ab..4d294124 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -59,9 +59,9 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis override fun getIsItemSelectable(position: Int) = true - override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.system_id + override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.thread_id - override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.system_id == key } + override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.thread_id == key } override fun onActionModeCreated() {} @@ -129,10 +129,10 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis return } - val conversationsToRemove = conversations.filter { selectedKeys.contains(it.system_id) } as ArrayList + val conversationsToRemove = conversations.filter { selectedKeys.contains(it.thread_id) } as ArrayList val positions = getSelectedItemPositions() conversationsToRemove.forEach { - activity.deleteConversation(it.system_id) + activity.deleteConversation(it.thread_id) } conversations.removeAll(conversationsToRemove) @@ -164,7 +164,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis } } - private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.system_id) } as ArrayList + private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.thread_id) } as ArrayList override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) @@ -184,7 +184,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis private fun setupView(view: View, conversation: Conversation) { view.apply { - conversation_frame.isSelected = selectedKeys.contains(conversation.system_id) + conversation_frame.isSelected = selectedKeys.contains(conversation.thread_id) conversation_address.text = conversation.title conversation_body_short.text = conversation.snippet diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt index 6cc15187..2f729a36 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -17,6 +17,6 @@ interface ConversationsDao { @Query("DELETE FROM conversations WHERE id = :id") fun delete(id: Long) - @Query("DELETE FROM conversations WHERE system_id = :threadId") + @Query("DELETE FROM conversations WHERE thread_id = :threadId") fun deleteThreadId(threadId: Long) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index f1636025..73e557c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -5,10 +5,10 @@ import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey -@Entity(tableName = "conversations", indices = [(Index(value = ["system_id"], unique = true))]) +@Entity(tableName = "conversations", indices = [(Index(value = ["thread_id"], unique = true))]) data class Conversation( @PrimaryKey(autoGenerate = true) var id: Long?, - @ColumnInfo(name = "system_id") var system_id: Int, + @ColumnInfo(name = "thread_id") var thread_id: Int, @ColumnInfo(name = "snippet") var snippet: String, @ColumnInfo(name = "date") var date: Int, @ColumnInfo(name = "read") var read: Boolean, From 0db8b202c76894f3baf123f3129c2344005d3e28 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 20:21:27 +0200 Subject: [PATCH 46/55] properly add new messages into the local database on receiving --- .../smsmessenger/extensions/Context.kt | 11 ++++++++--- .../smsmessenger/receivers/MmsReceiver.kt | 4 ++++ .../smsmessenger/receivers/SmsReceiver.kt | 10 +++++++--- 3 files changed, 19 insertions(+), 6 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 d5a2fc17..9971c827 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -180,7 +180,7 @@ fun Context.getMMSSender(msgId: Int): String { return "" } -fun Context.getConversations(): ArrayList { +fun Context.getConversations(threadId: Long? = null): ArrayList { val uri = Uri.parse("${Threads.CONTENT_URI}?simple=true") val projection = arrayOf( Threads._ID, @@ -190,8 +190,13 @@ fun Context.getConversations(): ArrayList { Threads.RECIPIENT_IDS ) - val selection = "${Threads.MESSAGE_COUNT} > ?" - val selectionArgs = arrayOf("0") + var selection = "${Threads.MESSAGE_COUNT} > ?" + var selectionArgs = arrayOf("0") + if (threadId != null) { + selection += " AND ${Threads._ID} = ?" + selectionArgs = arrayOf("0", threadId.toString()) + } + val sortOrder = "${Threads.DATE} DESC" val conversations = ArrayList() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt index da7f70be..9cdb9a1a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt @@ -6,6 +6,8 @@ import com.bumptech.glide.Glide import com.simplemobiletools.commons.extensions.isNumberBlocked import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.extensions.conversationsDB +import com.simplemobiletools.smsmessenger.extensions.getConversations import com.simplemobiletools.smsmessenger.extensions.getLatestMMS import com.simplemobiletools.smsmessenger.extensions.showReceivedMessageNotification @@ -32,6 +34,8 @@ class MmsReceiver : com.klinker.android.send_message.MmsReceivedReceiver() { } context.showReceivedMessageNotification(address, mms.body, mms.thread, glideBitmap, mms.id, true) + val conversation = context.getConversations(mms.thread.toLong()).firstOrNull() ?: return@ensureBackgroundThread + context.conversationsDB.insertOrUpdate(conversation) } } 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 4e79e291..a57e042a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -5,9 +5,8 @@ import android.content.Context import android.content.Intent import android.provider.Telephony import com.simplemobiletools.commons.extensions.isNumberBlocked -import com.simplemobiletools.smsmessenger.extensions.getThreadId -import com.simplemobiletools.smsmessenger.extensions.insertNewSMS -import com.simplemobiletools.smsmessenger.extensions.showReceivedMessageNotification +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.refreshMessages class SmsReceiver : BroadcastReceiver() { @@ -34,6 +33,11 @@ class SmsReceiver : BroadcastReceiver() { val messageId = context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId) context.showReceivedMessageNotification(address, body, threadId.toInt(), null, messageId, false) refreshMessages() + + ensureBackgroundThread { + val conversation = context.getConversations(threadId).firstOrNull() ?: return@ensureBackgroundThread + context.conversationsDB.insertOrUpdate(conversation) + } } } } From 8dd3fc561fc86d3f3c860f5dee5f35692b4984ec Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 20:29:37 +0200 Subject: [PATCH 47/55] mark messages as read in the local db too --- .../smsmessenger/activities/ThreadActivity.kt | 1 + .../smsmessenger/extensions/Context.kt | 5 +++-- .../smsmessenger/interfaces/ConversationsDao.kt | 3 +++ .../smsmessenger/receivers/MarkAsReadReceiver.kt | 12 ++++++++++-- 4 files changed, 17 insertions(+), 4 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 21c789f9..83773bd2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -421,6 +421,7 @@ class ThreadActivity : SimpleActivity() { if (!it.read) { hadUnreadItems = true markMessageRead(it.id, it.isMMS) + conversationsDB.markRead(threadId.toLong()) } } 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 9971c827..8e89f984 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -468,8 +468,6 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L } fun Context.deleteConversation(threadId: Int) { - conversationsDB.deleteThreadId(threadId.toLong()) - var uri = Sms.CONTENT_URI val selection = "${Sms.THREAD_ID} = ?" val selectionArgs = arrayOf(threadId.toString()) @@ -477,6 +475,8 @@ fun Context.deleteConversation(threadId: Int) { uri = Mms.CONTENT_URI contentResolver.delete(uri, selection, selectionArgs) + + conversationsDB.deleteThreadId(threadId.toLong()) } fun Context.deleteMessage(id: Int, isMMS: Boolean) { @@ -550,6 +550,7 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa action = MARK_AS_READ putExtra(MESSAGE_ID, messageId) putExtra(MESSAGE_IS_MMS, isMMS) + putExtra(THREAD_ID, threadID) } val markAsReadPendingIntent = PendingIntent.getBroadcast(this, 0, markAsReadIntent, PendingIntent.FLAG_CANCEL_CURRENT) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt index 2f729a36..422245ce 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -14,6 +14,9 @@ interface ConversationsDao { @Query("SELECT * FROM conversations") fun getAll(): List + @Query("UPDATE conversations SET read = 1 WHERE thread_id = :threadId") + fun markRead(threadId: Long) + @Query("DELETE FROM conversations WHERE id = :id") fun delete(id: Long) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MarkAsReadReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MarkAsReadReceiver.kt index f0cdff85..6dc79f93 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MarkAsReadReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MarkAsReadReceiver.kt @@ -4,19 +4,27 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import com.simplemobiletools.commons.extensions.notificationManager +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.smsmessenger.extensions.conversationsDB import com.simplemobiletools.smsmessenger.extensions.markMessageRead import com.simplemobiletools.smsmessenger.helpers.MARK_AS_READ import com.simplemobiletools.smsmessenger.helpers.MESSAGE_ID import com.simplemobiletools.smsmessenger.helpers.MESSAGE_IS_MMS +import com.simplemobiletools.smsmessenger.helpers.THREAD_ID class MarkAsReadReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { when (intent.action) { MARK_AS_READ -> { val messageId = intent.getIntExtra(MESSAGE_ID, 0) - val isMMS = intent.getBooleanExtra(MESSAGE_IS_MMS, false) - context.markMessageRead(messageId, isMMS) context.notificationManager.cancel(messageId) + ensureBackgroundThread { + val isMMS = intent.getBooleanExtra(MESSAGE_IS_MMS, false) + context.markMessageRead(messageId, isMMS) + + val threadId = intent.getIntExtra(THREAD_ID, 0) + context.conversationsDB.markRead(threadId.toLong()) + } } } } From 4dcd17fe1ff26c5aae84d4979a20647bac82128c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 21:01:01 +0200 Subject: [PATCH 48/55] fix #38, properly handle the VIEW third party intent --- app/src/main/AndroidManifest.xml | 1 + .../smsmessenger/activities/NewConversationActivity.kt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d8ef44e4..4c0108ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -45,6 +45,7 @@ + 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 bca2f70b..4baea150 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -95,9 +95,10 @@ class NewConversationActivity : SimpleActivity() { } private fun isThirdPartyIntent(): Boolean { - if (intent.action == Intent.ACTION_SENDTO && intent.dataString != null) { + if ((intent.action == Intent.ACTION_SENDTO || intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_VIEW) && intent.dataString != null) { val number = intent.dataString!!.removePrefix("sms:").removePrefix("smsto:").removePrefix("mms").removePrefix("mmsto:").trim() launchThreadActivity(URLDecoder.decode(number), "") + finish() return true } return false From 9a7529af68e068e6d78ff848b98aaec24f7fa3af Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 21:17:22 +0200 Subject: [PATCH 49/55] update commons to 5.28.25 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 04150cd0..21317af1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.28.24' + implementation 'com.simplemobiletools:commons:5.28.25' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' From 0d8cd9a5defe38fff8ee20c11466c6e5e92c69f2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 21:17:29 +0200 Subject: [PATCH 50/55] update version to 5.2.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 21317af1..7be53d19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 29 - versionCode 7 - versionName "5.1.4" + versionCode 9 + versionName "5.2.0" setProperty("archivesBaseName", "sms-messenger") } From 88af80a4563628b275d3e42f5637e6fe3bb167d7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 May 2020 21:18:04 +0200 Subject: [PATCH 51/55] updating changelog --- CHANGELOG.md | 8 ++++++++ fastlane/metadata/android/en-US/changelogs/9.txt | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/9.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index b0deb926..3036521f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========== +Version 5.2.0 *(2020-05-30)* +---------------------------- + + * Cache the conversations shown on the main screen to drastically improve their loading speed + * Allow adding newlines with the Enter button + * Properly handle a new View third party intent + * Added some other translation, UI and stability improvements + Version 5.1.4 *(2020-05-23)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/9.txt b/fastlane/metadata/android/en-US/changelogs/9.txt new file mode 100644 index 00000000..e8b55377 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/9.txt @@ -0,0 +1,4 @@ + * Cache the conversations shown on the main screen to drastically improve their loading speed + * Allow adding newlines with the Enter button + * Properly handle a new View third party intent + * Added some other translation, UI and stability improvements From e5c4be118c8bb6d6761c858e48d9eb979c96f91b Mon Sep 17 00:00:00 2001 From: Luis Alfredo Figueroa Bracamontes Date: Tue, 2 Jun 2020 11:58:58 -0500 Subject: [PATCH 52/55] =?UTF-8?q?Create=20strings.xml=20Espa=C3=B1ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I changed in some parts "managing" to "send" because it sounds better --- app/src/main/res/values-es/strings.xml | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 app/src/main/res/values-es/strings.xml diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..877a4042 --- /dev/null +++ b/app/src/main/res/values-es/strings.xml @@ -0,0 +1,70 @@ + + Mensajería SMS Simple + Mensajería SMS + Escribe un mensaje… + El mensaje no se ha enviado. + Añadir persona + Archivo adjunto + No se han encontrado conversaciones + Inicia una conversación + + + Nueva conversación + Escribe contacto o número… + Sugerencias + + + Mensaje recibico + Nuevo mensaje + Marcar como leído + + + ¿Estás seguro que quieres eliminar todos los mensajes en esta conversación? + + + + %d conversación + %d conversaciones + + + + + %d mensaje + %d mensajes + + + + ¿Por qué la aplicación requiere acceso a internet? + Tristemente es necesitado apra enviar archivos adjuntos MMS. El no poder enviar MMS sería una desventaja realmente enorme comparada con otras aplicaciones, así que decidimos tomar este camino. + Sin embargo, como siempre, no hay anuncios, rastreo o análisis, por lo que el internet solo es usado para enviar MMS. + + + + Mensajería SMS Simple - Mensajea fácilmente + + Una forma fácil y rápida de enviar mensajes SMS y MMS sin anuncios. + + Una excelente forma de estar en contacto con tus parientes, enviando mensajes SMS y MMS. La aplicación maneja adecuadamente mensajes grupales también, así como números bloqueados desde Android 7+. + + Ofrece varios formatos de fecha para escoger, para hacerte sentir cómodo mientras la usas. También puedes escoger entre formato de 12 y 24 horas. + + La aplicaicón pesa muy poco comparada con la competencia, haciendo que se descargue realmente rápido. + + Viene con diseño material y tema obscuro por defecto, proveyendo una excelente experiencia de usuario y un uso fácil. La falta de acceso a internet te da más privacidad, seguridad y estabilidad que otras aplicaciones. + + No contiene anuncios o permisos innecesarios. Es completamente de código abierto, provee colores personalizables. + Mira la suite completa de herramientas Simples aquí: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From 1fc2f612dbf5011344c8a24203ef88ec420efbe2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 2 Jun 2020 21:13:15 +0200 Subject: [PATCH 53/55] updating the spanish app descriptions --- .../metadata/android/es/full_description.txt | 18 ++++++++++++++++++ .../metadata/android/es/short_description.txt | 1 + fastlane/metadata/android/es/title.txt | 1 + 3 files changed, 20 insertions(+) create mode 100644 fastlane/metadata/android/es/full_description.txt create mode 100644 fastlane/metadata/android/es/short_description.txt create mode 100644 fastlane/metadata/android/es/title.txt diff --git a/fastlane/metadata/android/es/full_description.txt b/fastlane/metadata/android/es/full_description.txt new file mode 100644 index 00000000..0c808159 --- /dev/null +++ b/fastlane/metadata/android/es/full_description.txt @@ -0,0 +1,18 @@ +Una excelente forma de estar en contacto con tus parientes, enviando mensajes SMS y MMS. La aplicación maneja adecuadamente mensajes grupales también, así como números bloqueados desde Android 7+. + +Ofrece varios formatos de fecha para escoger, para hacerte sentir cómodo mientras la usas. También puedes escoger entre formato de 12 y 24 horas. + +La aplicaicón pesa muy poco comparada con la competencia, haciendo que se descargue realmente rápido. + +Viene con diseño material y tema obscuro por defecto, proveyendo una excelente experiencia de usuario y un uso fácil. La falta de acceso a internet te da más privacidad, seguridad y estabilidad que otras aplicaciones. + +No contiene anuncios o permisos innecesarios. Es completamente de código abierto, provee colores personalizables. + +Mira la suite completa de herramientas Simples aquí: +https://www.simplemobiletools.com + +Facebook: +https://www.facebook.com/simplemobiletools + +Reddit: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt new file mode 100644 index 00000000..af5b0127 --- /dev/null +++ b/fastlane/metadata/android/es/short_description.txt @@ -0,0 +1 @@ +Una forma fácil y rápida de enviar mensajes SMS y MMS sin anuncios. diff --git a/fastlane/metadata/android/es/title.txt b/fastlane/metadata/android/es/title.txt new file mode 100644 index 00000000..f5aab8d1 --- /dev/null +++ b/fastlane/metadata/android/es/title.txt @@ -0,0 +1 @@ +Mensajería SMS Simple - Mensajea fácilmente From 14d7579aac8db4ec89f8af60fc65a1645fc1bf37 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 7 Jun 2020 09:40:14 +0200 Subject: [PATCH 54/55] adding a new string for marking messages as unread --- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-nl/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 + 9 files changed, 10 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6034e936..ccd4a4c8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -17,6 +17,7 @@ Empfangene SMS neue Nachricht markiere als gelesen + Mark as Unread Möchtest du wirklich alle Nachrichten dieses Chat löschen? diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index c76c6d52..a10ddb94 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -17,6 +17,7 @@ Ελήφθη SMS Νέο μήνυμα Σήμανση ως αναγνωσμένου + Mark as Unread Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συνομιλίας; diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 877a4042..ea852951 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,6 +17,7 @@ Mensaje recibico Nuevo mensaje Marcar como leído + Mark as Unread ¿Estás seguro que quieres eliminar todos los mensajes en esta conversación? @@ -53,6 +54,7 @@ Viene con diseño material y tema obscuro por defecto, proveyendo una excelente experiencia de usuario y un uso fácil. La falta de acceso a internet te da más privacidad, seguridad y estabilidad que otras aplicaciones. No contiene anuncios o permisos innecesarios. Es completamente de código abierto, provee colores personalizables. + Mira la suite completa de herramientas Simples aquí: https://www.simplemobiletools.com diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 3418233a..492e988f 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -17,6 +17,7 @@ Gautos žinutės Nauja žinutė Mark as Read + Mark as Unread Ar tikrai norite ištrinti visas šio pokalbio žinutes? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fca93962..a007aa08 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -17,6 +17,7 @@ Ontvangen berichten Nieuw bericht Als gelezen markeren + Mark as Unread Alle berichten in dit gesprek verwijderen? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index ebf56905..c1f5c471 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -17,6 +17,7 @@ SMS recebida Nova mensagem Marcar como lida + Mark as Unread 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 55549886..95e6b2e2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -17,6 +17,7 @@ Получено SMS Новое сообщение Пометить прочитанным + Mark as Unread Вы уверены, что хотите удалить все сообщения в этой переписке? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 81fbe50b..cdbef4e7 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -17,6 +17,7 @@ Prijatá SMS Nová správa Označiť ako prečítané + Označiť ako neprečí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 a476612e..35038243 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ Received SMS New message Mark as Read + Mark as Unread Are you sure you want to delete all messages of this conversation? From 9d2a014d12bbb48f3fcc129071c85fba57eefea8 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sun, 7 Jun 2020 11:33:25 +0200 Subject: [PATCH 55/55] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index a007aa08..ef0e03e4 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -17,7 +17,7 @@ Ontvangen berichten Nieuw bericht Als gelezen markeren - Mark as Unread + Als ongelezen markeren Alle berichten in dit gesprek verwijderen?