From 18df98e8e43044c75b3e2ec15f3c87494bf3fa8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Freddy=20Mor=C3=A1n=20Jr?= Date: Fri, 6 Nov 2020 09:19:19 -0600 Subject: [PATCH 01/57] Updated Spanish translation - Translated the new string about showing char counter. --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0cb67e3e..2493646f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -8,7 +8,7 @@ No se han encontrado conversaciones Inicia una conversación Responder - Show a character counter at writing messages + Mostrar un contador de caracteres al escribir mensajes Nueva conversación From 67a02d71e9da059bc65db0cad036ee19f65f857d Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 9 Nov 2020 19:44:09 +0100 Subject: [PATCH 02/57] adding a github funding link --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..9bad22a9 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: [tibbi] +patreon: tiborkaputa +custom: ["https://www.paypal.com/paypalme/simplemobiletools", "https://www.simplemobiletools.com/donate"] From bae7f825ec37fe110d062bdd7ddbc24924eea1cd Mon Sep 17 00:00:00 2001 From: Hafitz Setya <71178188+breakdowns@users.noreply.github.com> Date: Fri, 20 Nov 2020 17:01:08 +0700 Subject: [PATCH 03/57] Added Indonesia translation --- app/src/main/res/values-id/strings.xml | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/src/main/res/values-id/strings.xml diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml new file mode 100644 index 00000000..ad4d5e19 --- /dev/null +++ b/app/src/main/res/values-id/strings.xml @@ -0,0 +1,74 @@ + + Simple SMS Messenger + SMS Messenger + Ketik pesan… + Pesan belum terkirim. + Tambahkan Orang + Lampiran + Tidak ada percakapan tersimpan yang ditemukan + Mulailah percakapan + Balas + Tunjukkan penghitung karakter saat menulis pesan + + + Percakapan baru + Tambahkan Kontak atau Nomor… + Saran + + + Menerima SMS + Pesan baru + Tandai sebagai Dibaca + Tandai sebagai Belum dibaca + + + Apakah Anda yakin ingin menghapus semua pesan dari percakapan ini? + + + + %d conversation + %d conversations + + + + + %d pesan + %d pesan + + + + Mengapa aplikasi membutuhkan akses ke internet? + Sayangnya itu diperlukan untuk mengirim lampiran MMS. Tidak dapat mengirim MMS akan menjadi kerugian yang sangat besar dibandingkan dengan aplikasi lain, jadi kami memutuskan untuk menggunakan cara ini. + Namun, seperti biasanya, tidak ada iklan, pelacakan atau analitik apa pun, internet hanya digunakan untuk mengirim 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 688c76f750d1e574355e8ddaf34c47f76f2a9ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Fri, 20 Nov 2020 22:33:36 +0000 Subject: [PATCH 04/57] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e91e9a06..486115a1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -8,7 +8,7 @@ Não foram encontradas conversas Iniciar uma conversa Responder - Show a character counter at writing messages + Mostrar número de caracteres ao escrever a mensagem Nova conversa From 763307251d70e8162a07e374ec8b666e70a6120f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20F=C4=B1r=C4=B1nc=C4=B1?= Date: Wed, 25 Nov 2020 22:57:33 +0300 Subject: [PATCH 05/57] Create strings.xml --- app/src/main/res/values-tr/strings.xml | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/src/main/res/values-tr/strings.xml diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 00000000..56eee7b0 --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,74 @@ + + Basit SMS Messenger + SMS Messenger + Bir mesaj yazın… + Mesaj gönderilmedi. + Kişi Ekle + Ek + Kaydedilmiş görüşme bulunamadı + Bir görüşme başlat + Yanıtla + Mesaj yazarken bir karakter sayacı göster + + + Yeni görüşme + Kişi veya Numara Ekle… + Öneriler + + + SMS alındı + Yeni mesaj + Okundu olarak işaretle + Okunmadı olarak işaretle + + + Bu görüşmenin tüm mesajlarını silmek istediğinizden emin misiniz? + + + + %d görüşme + %d görüşme + + + + + %d mesaj + %d mesaj + + + + Uygulama neden internete erişim gerektiriyor? + Ne yazık ki MMS eklerini göndermek için gerekli. MMS gönderememek, diğer uygulamalara kıyasla gerçekten çok büyük bir dezavantaj olacaktır, bu yüzden bu şekilde gitmeye karar verdik. + Bununla birlikte, genellikle olduğu gibi, hiçbir reklam, izleme veya analiz yoktur, internet yalnızca MMS göndermek için kullanılır. + + + + Basit SMS Messenger - Mesajları kolayca yönetin + + SMS ve MMS mesajlarını reklamsız yönetmenin kolay ve hızlı bir yolu. + + Hem SMS hem de MMS göndererek iletişim halinde kalmanın harika bir yolu. Uygulama, tıpkı Android 7 ve üzerinden gelen numaraları engellemek gibi grup mesajlaşmasını da düzgün bir şekilde yönetiyor. + + Kullanırken kendinizi rahat hissetmeniz için pek çok tarih formatı sunar. 12 ve 24 saatlik zaman formatı arasında da geçiş yapabilirsiniz. + + Rakiplerine kıyasla gerçekten çok küçük bir uygulama boyutuna sahip ve indirmeyi gerçekten hızlı hale getiriyor. + + Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar. + + Hiçbir reklam veya gereksiz izinler içermez. Tamamen açık kaynaklıdır, özelleştirilebilir renkler sağlar. + + Basit Araçlar paketinin tamamına buradan göz atın: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From 521731ec2c0fdc0f62469d2055cb6f97320eb654 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 28 Nov 2020 22:31:36 +0100 Subject: [PATCH 06/57] updating kotlin, commons, gradle --- app/build.gradle | 2 +- build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 420817fd..1295bb2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.31.23' + implementation 'com.simplemobiletools:commons:5.32.2' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' diff --git a/build.gradle b/build.gradle index b55955d2..4b5c3db4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.10' + ext.kotlin_version = '1.4.20' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:4.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 64011e10835d4d383792d0907d8af2250f387c63 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 28 Nov 2020 22:44:21 +0100 Subject: [PATCH 07/57] adding some crashfixes --- .../smsmessenger/activities/ThreadActivity.kt | 4 ++++ .../simplemobiletools/smsmessenger/extensions/Context.kt | 6 +++++- 2 files changed, 9 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 220694fc..efd3b062 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -588,6 +588,8 @@ class ThreadActivity : SimpleActivity() { message.addMedia(byteArray, mimeType) } catch (e: Exception) { showErrorToast(e) + } catch (e: Error) { + toast(e.localizedMessage ?: getString(R.string.unknown_error_occurred)) } } } @@ -601,6 +603,8 @@ class ThreadActivity : SimpleActivity() { thread_attachments_wrapper.removeAllViews() } catch (e: Exception) { showErrorToast(e) + } catch (e: Error) { + toast(e.localizedMessage ?: getString(R.string.unknown_error_occurred)) } } 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 d9590a91..5eba91ed 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -491,7 +491,11 @@ fun Context.deleteMessage(id: Int, isMMS: Boolean) { val uri = if (isMMS) Mms.CONTENT_URI else Sms.CONTENT_URI val selection = "${Sms._ID} = ?" val selectionArgs = arrayOf(id.toString()) - contentResolver.delete(uri, selection, selectionArgs) + try { + contentResolver.delete(uri, selection, selectionArgs) + } catch (e: Exception) { + showErrorToast(e) + } } fun Context.markMessageRead(id: Int, isMMS: Boolean) { From f66833e9bd5d563ce2afb2e77400cf4ade2af2f7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 28 Nov 2020 22:47:11 +0100 Subject: [PATCH 08/57] complicate the threading at receiving messages a bit more --- .../smsmessenger/receivers/SmsReceiver.kt | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt index a6e7e6d0..cfb61959 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -3,6 +3,8 @@ package com.simplemobiletools.smsmessenger.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.os.Handler +import android.os.Looper import android.provider.Telephony import com.simplemobiletools.commons.extensions.isNumberBlocked import com.simplemobiletools.commons.helpers.ensureBackgroundThread @@ -21,25 +23,29 @@ class SmsReceiver : BroadcastReceiver() { val read = 0 val subscriptionId = intent.getIntExtra("subscription", -1) - messages.forEach { - address = it.originatingAddress ?: "" - subject = it.pseudoSubject - body += it.messageBody - date = Math.min(it.timestampMillis, System.currentTimeMillis()) - threadId = context.getThreadId(address) - } - - if (!context.isNumberBlocked(address)) { - ensureBackgroundThread { - context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId) - - val conversation = context.getConversations(threadId).firstOrNull() ?: return@ensureBackgroundThread - context.conversationsDB.insertOrUpdate(conversation) - context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) + ensureBackgroundThread { + messages.forEach { + address = it.originatingAddress ?: "" + subject = it.pseudoSubject + body += it.messageBody + date = Math.min(it.timestampMillis, System.currentTimeMillis()) + threadId = context.getThreadId(address) } - context.showReceivedMessageNotification(address, body, threadId.toInt(), null) - refreshMessages() + Handler(Looper.getMainLooper()).post { + if (!context.isNumberBlocked(address)) { + ensureBackgroundThread { + context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId) + + val conversation = context.getConversations(threadId).firstOrNull() ?: return@ensureBackgroundThread + context.conversationsDB.insertOrUpdate(conversation) + context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) + } + + context.showReceivedMessageNotification(address, body, threadId.toInt(), null) + refreshMessages() + } + } } } } From 7b588fb8a55e3c6b9e6e1e75dfad3e7ce74bfe95 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 5 Dec 2020 21:33:08 +0100 Subject: [PATCH 09/57] adding japanese translation --- app/src/main/res/values-ja/strings.xml | 72 ++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 app/src/main/res/values-ja/strings.xml diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..548d090b --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,72 @@ + + Simple ショートメール + ショートメール + メッセージを入力してください… + 送信されませんでした。 + 宛先を追加 + 添付 + 保存された会話はありません + 会話を始める + 返信 + メッセージ入力中に文字カウントを表示する + + + 新しい会話 + 連絡先や電話番号を追加する… + おすすめ + + + 受信したショートメール + 新しいメッセージ + 既読にする + 未読にする + + + 本当にこの会話の全てのメッセージを削除しますか? + + + + %d件の会話 + %d件の会話 + + + + + %件のメッセージ + %件のメッセージ + + + + なぜアプリ使用にインターネットへのアクセスが必要なのですか? + 生憎、MMS(マルチメディアメッセージサービス)にインターネットが必要となります。他のアプリと比較して、MMSを使用出来ないと大きな損になるので、こうすることに決めました。 + ただし、通常通り広告・追跡・分析は一切行われず、MMS送信にのみインターネットが使われます。 + + + + シンプルなSMSメッセンジャー-メッセージを簡単に管理 + + SMS、MMSメッセージをすばやく送信。広告なしのきれいで美しいカスタマイズ可能なインターフェイス + + SMSやMMSメッセージは親戚と連絡を取るのに便利です。グループメッセージも可能で、アンドロイド7以降のように連絡先をブロックすることも出来ます。 + + 日付フォーマットも複数から使いやすいものを選ぶことができます。日時設定は12時間設定と24時間設定に切り変えることも可能です。 + + 容量が他のアプリと比べて小さいため早くダウンロードができます。 + + 広告や不要な権限はありません。 完全にオープンソースで、カラーもカスタマイズ可能。 + + シンプルツールの完全なリストはこちらからご確認ください: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From 8b17b8a13e100ff5f0dc81dde1b68d52a9bbac7b Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 6 Dec 2020 16:10:52 +0100 Subject: [PATCH 10/57] updating commons to 5.32.5 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1295bb2f..89a69fed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.32.2' + implementation 'com.simplemobiletools:commons:5.32.5' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' From 75fb84f9d4258fcb966f7e6390d18c95b2dd9972 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 6 Dec 2020 16:36:31 +0100 Subject: [PATCH 11/57] fix #103, make sure private contact names are shown at group conversations --- .../smsmessenger/activities/MainActivity.kt | 14 +------------ .../smsmessenger/extensions/Context.kt | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 18 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 3e57dd0e..fa266e34 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -185,20 +185,8 @@ class MainActivity : SimpleActivity() { private fun getNewConversations(cachedConversations: ArrayList) { val privateCursor = getMyContactsCursor().loadInBackground() ensureBackgroundThread { - val conversations = getConversations() - - // check if no message came from a privately stored contact in Simple Contacts val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) - if (privateContacts.isNotEmpty()) { - conversations.filter { it.title == it.phoneNumber }.forEach { conversation -> - privateContacts.forEach { contact -> - if (contact.doesContainPhoneNumber(conversation.phoneNumber)) { - conversation.title = contact.name - conversation.photoUri = contact.photoUri - } - } - } - } + val conversations = getConversations(privateContacts = privateContacts) runOnUiThread { setupConversations(conversations) 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 5eba91ed..b49943a1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -185,7 +185,7 @@ fun Context.getMMSSender(msgId: Int): String { return "" } -fun Context.getConversations(threadId: Long? = null): ArrayList { +fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList = ArrayList()): ArrayList { val uri = Uri.parse("${Threads.CONTENT_URI}?simple=true") val projection = arrayOf( Threads._ID, @@ -226,7 +226,7 @@ fun Context.getConversations(threadId: Long? = null): ArrayList { return@queryCursor } - val names = getThreadContactNames(phoneNumbers) + val names = getThreadContactNames(phoneNumbers, privateContacts) val title = TextUtils.join(", ", names.toTypedArray()) val photoUri = if (phoneNumbers.size == 1) simpleContactHelper.getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" val isGroupConversation = phoneNumbers.size > 1 @@ -356,10 +356,20 @@ fun Context.getThreadPhoneNumbers(recipientIds: List): ArrayList { return numbers } -fun Context.getThreadContactNames(phoneNumbers: List): ArrayList { +fun Context.getThreadContactNames(phoneNumbers: List, privateContacts: ArrayList): ArrayList { val names = ArrayList() - phoneNumbers.forEach { - names.add(SimpleContactsHelper(this).getNameFromPhoneNumber(it)) + phoneNumbers.forEach { number -> + val name = SimpleContactsHelper(this).getNameFromPhoneNumber(number) + if (name != number) { + names.add(name) + } else { + val privateContact = privateContacts.firstOrNull { it.doesContainPhoneNumber(number) } + if (privateContact == null) { + names.add(name) + } else { + names.add(privateContact.name) + } + } } return names } From cb7813862383674d52d15de7c48ee56087aa9263 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 6 Dec 2020 16:42:04 +0100 Subject: [PATCH 12/57] update version to 5.5.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 89a69fed..eacbba7a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 30 - versionCode 18 - versionName "5.5.0" + versionCode 19 + versionName "5.5.1" setProperty("archivesBaseName", "sms-messenger") } From 5c9f8e8f5151f19d85c3e9ed6887904ae8cbfa0a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 6 Dec 2020 16:42:12 +0100 Subject: [PATCH 13/57] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/19.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/19.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index cda2ade2..1d838e03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 5.5.1 *(2020-12-06)* +---------------------------- + + * Properly show private contact names at group conversations + * Fixed private contacts not being visible on Android 11+ + * Some stability and translation improvements + Version 5.5.0 *(2020-11-04)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/19.txt b/fastlane/metadata/android/en-US/changelogs/19.txt new file mode 100644 index 00000000..c0c72c8a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/19.txt @@ -0,0 +1,3 @@ + * Properly show private contact names at group conversations + * Fixed private contacts not being visible on Android 11+ + * Some stability and translation improvements From f2ebd6b648f118138698f62918a76c32c41a997a Mon Sep 17 00:00:00 2001 From: bac1 <75886884+bac1@users.noreply.github.com> Date: Tue, 15 Dec 2020 16:57:15 +0000 Subject: [PATCH 14/57] Create strings.xml Add Ukrainian translation (full) --- app/src/main/res/values-uk/strings.xml | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/src/main/res/values-uk/strings.xml diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml new file mode 100644 index 00000000..1b6efd8c --- /dev/null +++ b/app/src/main/res/values-uk/strings.xml @@ -0,0 +1,74 @@ + + Simple SMS Messenger + Повідомлення + Введіть повідомлення… + Повідомлення не надіслано. + Додати учасник а + Вкладення + Немає збережених листувань + Почати листування + Відповідь + Показувати кількість символів + + + Нове листування + Додати контакт аба номер… + Пропозиція + + + Отримано повідомлення + Нове повідомлення + Прочитано + Не прочитано + + + Видалити усі повідомлення у цьому листуванні? + + + + %d листування + %d листувань + + + + + %d повідомлення + %d повідомлень + + + + Чому додаток потрубує доступу до інтернету? + Нажаль, це необхідно для відправки вкладень MMS. Неспроможність надсилати MMS-повідомлення була б великим недоліком нашого додатку порівняно з іншими, тому ми так зробили. + Тим не менше, як і в інших наших додатках, цей не містить реклами, відстеження та аналітики. Інтернет використовується лише для відправки MMS. + + + + Simple SMS Messenger - просте управління SMS + + Простий та швидкий спосіб управління повідомленнями SMS та MMS без реклами. + + SMS/MMS-повідомлення — це чудовий спосіб підтримувати зв\'язок із близькими. Додаток також правильно опрацьовує групові повідомлення та блокування номер на Android 7+. + + Підтримується багати форматів часу, щоб вам було зручно користуватися додатком. Також ви можете вибирати між 12- та 24-годинним форматом часу. + + Наш додаток має малий розмір в порівнянні з конкурентами, що робить його завантаження таким швидким. + + За замовчуванням використовується матеріальний дизайн та темна тема, що забезпечую зручне використання. Відсутність доступу в інтернет забезпечую вам більшу приватність порівняно з іншими додатками. + + Не містить рекламу та непотрібних дозволів. Має повністю відкритий "початковий" код, також є можливість налаштувати кольори інтерфейсу. + + Ознакомьтеся з повним набором інструментів Simple тут: + https://www.simplemobiletools.com + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From 1e511e84714338bccc874700147851377d3ae228 Mon Sep 17 00:00:00 2001 From: bac1 <75886884+bac1@users.noreply.github.com> Date: Tue, 15 Dec 2020 17:05:29 +0000 Subject: [PATCH 15/57] Update strings.xml --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 1b6efd8c..276fe247 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -51,7 +51,7 @@ Підтримується багати форматів часу, щоб вам було зручно користуватися додатком. Також ви можете вибирати між 12- та 24-годинним форматом часу. - Наш додаток має малий розмір в порівнянні з конкурентами, що робить його завантаження таким швидким. + Наш додаток має малий розмір в порівнянні з додатками конкурентів, що робить його завантаження таким швидким. За замовчуванням використовується матеріальний дизайн та темна тема, що забезпечую зручне використання. Відсутність доступу в інтернет забезпечую вам більшу приватність порівняно з іншими додатками. From 96636bff6e6be79cfd2dd12b734d9eab04e33b46 Mon Sep 17 00:00:00 2001 From: bac1 <75886884+bac1@users.noreply.github.com> Date: Tue, 15 Dec 2020 19:46:45 +0000 Subject: [PATCH 16/57] Update strings.xml --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 276fe247..fb6faf8b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -55,7 +55,7 @@ За замовчуванням використовується матеріальний дизайн та темна тема, що забезпечую зручне використання. Відсутність доступу в інтернет забезпечую вам більшу приватність порівняно з іншими додатками. - Не містить рекламу та непотрібних дозволів. Має повністю відкритий "початковий" код, також є можливість налаштувати кольори інтерфейсу. + Цей додаток не буде показувати рекламу, потрібні лише найнеобхідніші дозволи. Додаток має повністю відкритий програмний код, кольори оформлення можна легко налаштувати. Ознакомьтеся з повним набором інструментів Simple тут: https://www.simplemobiletools.com From be6ac3bdb1441cfc014eb288a8e16574349e7cde Mon Sep 17 00:00:00 2001 From: bac1 <75886884+bac1@users.noreply.github.com> Date: Wed, 16 Dec 2020 06:15:22 +0000 Subject: [PATCH 17/57] Update strings.xml --- app/src/main/res/values-uk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fb6faf8b..f72883e8 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -47,9 +47,9 @@ Простий та швидкий спосіб управління повідомленнями SMS та MMS без реклами. - SMS/MMS-повідомлення — це чудовий спосіб підтримувати зв\'язок із близькими. Додаток також правильно опрацьовує групові повідомлення та блокування номер на Android 7+. + SMS/MMS-повідомлення — це чудовий спосіб підтримувати зв\'язок із близькими. Додаток також правильно опрацьовує групові повідомлення та блокування номера на Android 7+. - Підтримується багати форматів часу, щоб вам було зручно користуватися додатком. Також ви можете вибирати між 12- та 24-годинним форматом часу. + Підтримується багато форматів часу, щоб вам було зручно користуватися додатком. Також ви можете вибирати між 12- та 24-годинним форматом часу. Наш додаток має малий розмір в порівнянні з додатками конкурентів, що робить його завантаження таким швидким. From f412f401d3a5b339c0d0e21be3334b66fc0cd88c Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 11:38:57 +0100 Subject: [PATCH 18/57] adding some crashfixes --- app/build.gradle | 8 ++++---- .../smsmessenger/activities/MainActivity.kt | 2 +- .../smsmessenger/activities/NewConversationActivity.kt | 2 +- .../smsmessenger/activities/ThreadActivity.kt | 2 +- .../smsmessenger/adapters/ThreadAdapter.kt | 9 ++++++++- .../simplemobiletools/smsmessenger/extensions/Context.kt | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index eacbba7a..fcfc9561 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,13 +56,13 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.32.5' + implementation 'com.simplemobiletools:commons:5.32.8' implementation 'org.greenrobot:eventbus:3.2.0' implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' implementation "me.leolin:ShortcutBadger:1.1.22" - kapt "androidx.room:room-compiler:2.2.5" - implementation "androidx.room:room-runtime:2.2.5" - annotationProcessor "androidx.room:room-compiler:2.2.5" + kapt "androidx.room:room-compiler:2.2.6" + implementation "androidx.room:room-runtime:2.2.6" + annotationProcessor "androidx.room:room-compiler:2.2.6" } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt index fa266e34..4afcff73 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -183,7 +183,7 @@ class MainActivity : SimpleActivity() { } private fun getNewConversations(cachedConversations: ArrayList) { - val privateCursor = getMyContactsCursor().loadInBackground() + val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) val conversations = getConversations(privateContacts = privateContacts) 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 68b9c411..31cf896c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -144,7 +144,7 @@ class NewConversationActivity : SimpleActivity() { } private fun fillSuggestedContacts(callback: () -> Unit) { - val privateCursor = getMyContactsCursor().loadInBackground() + val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) val suggestions = getSuggestedContacts(privateContacts) 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 efd3b062..6d926341 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -99,7 +99,7 @@ class ThreadActivity : SimpleActivity() { } private fun setupThread() { - val privateCursor = getMyContactsCursor().loadInBackground() + val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { messages = getMessages(threadId) participants = if (messages.isEmpty()) { 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 dfef567b..b28f3f44 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -145,7 +145,14 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList): Long { } fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?) { - val privateCursor = getMyContactsCursor().loadInBackground() + val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { var sender = getNameAndPhotoFromPhoneNumber(address)?.name ?: "" if (address == sender) { From ceb98969888c2139b50be8654b08eb08437935d1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 12:40:29 +0100 Subject: [PATCH 19/57] changing message id from Int to Long --- .../smsmessenger/adapters/ThreadAdapter.kt | 10 ++--- .../smsmessenger/extensions/Context.kt | 38 +++++++++---------- .../smsmessenger/models/Message.kt | 2 +- .../smsmessenger/models/MessageAttachment.kt | 2 +- .../smsmessenger/models/ThreadError.kt | 2 +- .../smsmessenger/models/ThreadSuccess.kt | 2 +- 6 files changed, 27 insertions(+), 29 deletions(-) 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 b28f3f44..0702dd4c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -81,9 +81,9 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList + val messagesToRemove = getSelectedItems() val positions = getSelectedItemPositions() messagesToRemove.forEach { activity.deleteMessage((it as Message).id, it.isMMS) @@ -186,7 +186,7 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList + private fun getSelectedItems() = messages.filter { selectedKeys.contains((it as? Message)?.hashCode() ?: 0) } as ArrayList private fun isThreadDateTime(position: Int) = messages.getOrNull(position) is ThreadDateTime @@ -199,7 +199,7 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList { return@queryCursor } - val id = cursor.getIntValue(Sms._ID) + val id = cursor.getLongValue(Sms._ID) val body = cursor.getStringValue(Sms.BODY) val type = cursor.getIntValue(Sms.TYPE) val namePhoto = getNameAndPhotoFromPhoneNumber(senderNumber) - val senderName = namePhoto?.name ?: "" - val photoUri = namePhoto?.photoUri ?: "" + val senderName = namePhoto.name + val photoUri = namePhoto.photoUri ?: "" val date = (cursor.getLongValue(Sms.DATE) / 1000).toInt() val read = cursor.getIntValue(Sms.READ) == 1 val thread = cursor.getIntValue(Sms.THREAD_ID) @@ -127,7 +127,7 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< val contactsMap = HashMap() val threadParticipants = HashMap>() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> - val mmsId = cursor.getIntValue(Mms._ID) + val mmsId = cursor.getLongValue(Mms._ID) val type = cursor.getIntValue(Mms.MESSAGE_BOX) val date = cursor.getLongValue(Mms.DATE).toInt() val read = cursor.getIntValue(Mms.READ) == 1 @@ -143,17 +143,15 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< val isMMS = true val attachment = getMmsAttachment(mmsId) - val body = attachment?.text ?: "" + val body = attachment.text var senderName = "" var senderPhotoUri = "" if (type != Mms.MESSAGE_BOX_SENT && type != Mms.MESSAGE_BOX_FAILED) { val number = getMMSSender(mmsId) val namePhoto = getNameAndPhotoFromPhoneNumber(number) - if (namePhoto != null) { - senderName = namePhoto.name - senderPhotoUri = namePhoto.photoUri ?: "" - } + senderName = namePhoto.name + senderPhotoUri = namePhoto.photoUri ?: "" } val message = Message(mmsId, body, type, participants, date, read, threadId, isMMS, attachment, senderName, senderPhotoUri, subscriptionId) @@ -167,7 +165,7 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< return messages } -fun Context.getMMSSender(msgId: Int): String { +fun Context.getMMSSender(msgId: Long): String { val uri = Uri.parse("${Mms.CONTENT_URI}/$msgId/addr") val projection = arrayOf( Mms.Addr.ADDRESS @@ -241,7 +239,7 @@ fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList< // based on https://stackoverflow.com/a/6446831/1967672 @SuppressLint("NewApi") -fun Context.getMmsAttachment(id: Int): MessageAttachment? { +fun Context.getMmsAttachment(id: Long): MessageAttachment { val uri = if (isQPlus()) { Mms.Part.CONTENT_URI } else { @@ -335,8 +333,8 @@ fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap): Arr 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, blockedNumbers)) { + var senderName = namePhoto.name + var photoUri = namePhoto.photoUri ?: "" + if (isNumberBlocked(senderNumber, blockedNumbers)) { return@queryCursor } else if (namePhoto.name == senderNumber) { if (privateContacts.isNotEmpty()) { @@ -437,7 +435,7 @@ fun Context.getSuggestedContacts(privateContacts: ArrayList): Arr return contacts } -fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto? { +fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto { if (!hasPermission(PERMISSION_READ_CONTACTS)) { return NamePhoto(number, null) } @@ -497,7 +495,7 @@ fun Context.deleteConversation(threadId: Int) { conversationsDB.deleteThreadId(threadId.toLong()) } -fun Context.deleteMessage(id: Int, isMMS: Boolean) { +fun Context.deleteMessage(id: Long, isMMS: Boolean) { val uri = if (isMMS) Mms.CONTENT_URI else Sms.CONTENT_URI val selection = "${Sms._ID} = ?" val selectionArgs = arrayOf(id.toString()) @@ -508,7 +506,7 @@ fun Context.deleteMessage(id: Int, isMMS: Boolean) { } } -fun Context.markMessageRead(id: Int, isMMS: Boolean) { +fun Context.markMessageRead(id: Long, isMMS: Boolean) { val uri = if (isMMS) Mms.CONTENT_URI else Sms.CONTENT_URI val contentValues = ContentValues().apply { put(Sms.READ, 1) @@ -581,7 +579,7 @@ fun Context.getThreadId(addresses: Set): Long { fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?) { val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { - var sender = getNameAndPhotoFromPhoneNumber(address)?.name ?: "" + var sender = getNameAndPhotoFromPhoneNumber(address).name if (address == sender) { val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) sender = privateContacts.firstOrNull { it.doesContainPhoneNumber(address) }?.name ?: address 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 e18df07c..a0c2631d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt @@ -4,7 +4,7 @@ import android.provider.Telephony import com.simplemobiletools.commons.models.SimpleContact data class Message( - val id: Int, val body: String, val type: Int, val participants: ArrayList, val date: Int, val read: Boolean, val thread: Int, + val id: Long, val body: String, val type: Int, val participants: ArrayList, val date: Int, val read: Boolean, val thread: Int, val isMMS: Boolean, val attachment: MessageAttachment?, var senderName: String, val senderPhotoUri: String, val subscriptionId: Int) : ThreadItem() { fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt index 53f4b94f..51fd8ee2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.smsmessenger.models -data class MessageAttachment(val id: Int, var text: String, var attachments: ArrayList) +data class MessageAttachment(val id: Long, var text: String, var attachments: ArrayList) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadError.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadError.kt index 69df786f..9b0f003e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadError.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadError.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.smsmessenger.models -data class ThreadError(val messageID: Int) : ThreadItem() +data class ThreadError(val messageID: Long) : ThreadItem() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadSuccess.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadSuccess.kt index ec7a4d20..fa75eb53 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadSuccess.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ThreadSuccess.kt @@ -1,4 +1,4 @@ package com.simplemobiletools.smsmessenger.models // show a check after the latest message, if it is a sent one and succeeded -data class ThreadSuccess(val messageID: Int) : ThreadItem() +data class ThreadSuccess(val messageID: Long) : ThreadItem() From 4cad41347835da292630fc6a134c2da1b9404018 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 15:29:10 +0100 Subject: [PATCH 20/57] store attachment uri as a string --- .../smsmessenger/activities/ThreadActivity.kt | 4 ++-- .../simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt | 2 +- .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 4 ++-- .../com/simplemobiletools/smsmessenger/models/Attachment.kt | 4 +++- .../simplemobiletools/smsmessenger/receivers/MmsReceiver.kt | 2 +- 5 files changed, 9 insertions(+), 7 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 6d926341..931c9ad9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -146,12 +146,12 @@ class ThreadActivity : SimpleActivity() { if (it.mimetype.startsWith("image/")) { val fileOptions = BitmapFactory.Options() fileOptions.inJustDecodeBounds = true - BitmapFactory.decodeStream(contentResolver.openInputStream(it.uri), null, fileOptions) + BitmapFactory.decodeStream(contentResolver.openInputStream(it.getUri()), null, fileOptions) it.width = fileOptions.outWidth it.height = fileOptions.outHeight } else if (it.mimetype.startsWith("video/")) { val metaRetriever = MediaMetadataRetriever() - metaRetriever.setDataSource(this, it.uri) + metaRetriever.setDataSource(this, it.getUri()) it.width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!.toInt() it.height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!.toInt() } 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 0702dd4c..fe750b20 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -225,7 +225,7 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList Date: Mon, 21 Dec 2020 16:17:33 +0100 Subject: [PATCH 21/57] create a db table for attachments --- .../smsmessenger/databases/MessagesDatabase.kt | 17 ++++++++++++++++- .../smsmessenger/extensions/Context.kt | 9 ++++++--- .../smsmessenger/interfaces/AttachmentsDao.kt | 11 +++++++++++ .../smsmessenger/models/Attachment.kt | 15 ++++++++++++++- 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index a514dd12..774bc8a4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -4,14 +4,20 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao +import com.simplemobiletools.smsmessenger.models.Attachment import com.simplemobiletools.smsmessenger.models.Conversation -@Database(entities = [(Conversation::class)], version = 1) +@Database(entities = [Conversation::class, Attachment::class], version = 2) abstract class MessagesDatabase : RoomDatabase() { abstract fun ConversationsDao(): ConversationsDao + abstract fun AttachmentsDao(): AttachmentsDao + companion object { private var db: MessagesDatabase? = null @@ -20,11 +26,20 @@ abstract class MessagesDatabase : RoomDatabase() { synchronized(MessagesDatabase::class) { if (db == null) { db = Room.databaseBuilder(context.applicationContext, MessagesDatabase::class.java, "conversations.db") + .fallbackToDestructiveMigration() + .addMigrations(MIGRATION_1_2) .build() } } } return db!! } + + private val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") + database.execSQL("CREATE UNIQUE INDEX `index_attachments_message_id` ON `attachments` (`message_id`)") + } + } } } 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 79673bf6..83b7104b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -27,6 +27,7 @@ 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.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver @@ -41,6 +42,8 @@ fun Context.getMessagessDB() = MessagesDatabase.getInstance(this) val Context.conversationsDB: ConversationsDao get() = getMessagessDB().ConversationsDao() +val Context.attachmentsDB: AttachmentsDao get() = getMessagessDB().AttachmentsDao() + fun Context.getMessages(threadId: Int): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( @@ -257,15 +260,15 @@ fun Context.getMmsAttachment(id: Long): MessageAttachment { var attachmentName = "" queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> - val partId = cursor.getStringValue(Mms._ID) + val partId = cursor.getLongValue(Mms._ID) val mimetype = cursor.getStringValue(Mms.Part.CONTENT_TYPE) if (mimetype == "text/plain") { messageAttachment.text = cursor.getStringValue(Mms.Part.TEXT) ?: "" } else if (mimetype.startsWith("image/") || mimetype.startsWith("video/")) { - val attachment = Attachment(Uri.withAppendedPath(uri, partId).toString(), mimetype, 0, 0, "") + val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, "") messageAttachment.attachments.add(attachment) } else if (mimetype != "application/smil") { - val attachment = Attachment(Uri.withAppendedPath(uri, partId).toString(), mimetype, 0, 0, attachmentName) + val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentName) messageAttachment.attachments.add(attachment) } else { val text = cursor.getStringValue(Mms.Part.TEXT) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt new file mode 100644 index 00000000..240fa747 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.smsmessenger.interfaces + +import androidx.room.Dao +import androidx.room.Query +import com.simplemobiletools.smsmessenger.models.Attachment + +@Dao +interface AttachmentsDao { + @Query("SELECT * FROM attachments") + fun getAll(): List +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt index dec7cd1b..4aabd072 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt @@ -1,7 +1,20 @@ package com.simplemobiletools.smsmessenger.models import android.net.Uri +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity(tableName = "attachments", indices = [(Index(value = ["message_id"], unique = true))]) +data class Attachment( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "message_id") var messageId: Long, + @ColumnInfo(name = "uri_string") var uriString: String, + @ColumnInfo(name = "mimetype") var mimetype: String, + @ColumnInfo(name = "width") var width: Int, + @ColumnInfo(name = "height") var height: Int, + @ColumnInfo(name = "filename") var filename: String) { -data class Attachment(var uriString: String, var mimetype: String, var width: Int, var height: Int, var filename: String) { fun getUri() = Uri.parse(uriString) } From b955678e904fbad634ee4b30f3be0d391b576edf Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 16:40:48 +0100 Subject: [PATCH 22/57] creating a database table for MessageAttachments too --- .../smsmessenger/databases/MessagesDatabase.kt | 11 ++++++++++- .../smsmessenger/extensions/Context.kt | 3 +++ .../smsmessenger/helpers/Converters.kt | 17 +++++++++++++++++ .../interfaces/MessageAttachmentsDao.kt | 11 +++++++++++ .../smsmessenger/models/MessageAttachment.kt | 10 +++++++++- 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessageAttachmentsDao.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index 774bc8a4..cfbde698 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -4,20 +4,27 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.TypeConverters import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase +import com.simplemobiletools.smsmessenger.helpers.Converters import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao +import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao import com.simplemobiletools.smsmessenger.models.Attachment import com.simplemobiletools.smsmessenger.models.Conversation +import com.simplemobiletools.smsmessenger.models.MessageAttachment -@Database(entities = [Conversation::class, Attachment::class], version = 2) +@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class], version = 2) +@TypeConverters(Converters::class) abstract class MessagesDatabase : RoomDatabase() { abstract fun ConversationsDao(): ConversationsDao abstract fun AttachmentsDao(): AttachmentsDao + abstract fun MessageAttachmentsDao(): MessageAttachmentsDao + companion object { private var db: MessagesDatabase? = null @@ -37,6 +44,8 @@ abstract class MessagesDatabase : RoomDatabase() { private val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `message_attachments` (`id` INTEGER PRIMARY KEY NOT NULL, `text` TEXT NOT NULL, `attachments` TEXT NOT NULL)") + database.execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") database.execSQL("CREATE UNIQUE INDEX `index_attachments_message_id` ON `attachments` (`message_id`)") } 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 83b7104b..b8627e35 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -29,6 +29,7 @@ import com.simplemobiletools.smsmessenger.databases.MessagesDatabase import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao +import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver @@ -44,6 +45,8 @@ val Context.conversationsDB: ConversationsDao get() = getMessagessDB().Conversat val Context.attachmentsDB: AttachmentsDao get() = getMessagessDB().AttachmentsDao() +val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB().MessageAttachmentsDao() + fun Context.getMessages(threadId: Int): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt new file mode 100644 index 00000000..5c168683 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt @@ -0,0 +1,17 @@ +package com.simplemobiletools.smsmessenger.helpers + +import androidx.room.TypeConverter +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.smsmessenger.models.Attachment + +class Converters { + private val gson = Gson() + private val attachmentType = object : TypeToken>() {}.type + + @TypeConverter + fun jsonToAttachmentList(value: String) = gson.fromJson>(value, attachmentType) + + @TypeConverter + fun attachmentListToJson(list: ArrayList) = gson.toJson(list) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessageAttachmentsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessageAttachmentsDao.kt new file mode 100644 index 00000000..8517f80d --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessageAttachmentsDao.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.smsmessenger.interfaces + +import androidx.room.Dao +import androidx.room.Query +import com.simplemobiletools.smsmessenger.models.MessageAttachment + +@Dao +interface MessageAttachmentsDao { + @Query("SELECT * FROM message_attachments") + fun getAll(): List +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt index 51fd8ee2..a95ea775 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/MessageAttachment.kt @@ -1,3 +1,11 @@ package com.simplemobiletools.smsmessenger.models -data class MessageAttachment(val id: Long, var text: String, var attachments: ArrayList) +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "message_attachments") +data class MessageAttachment( + @PrimaryKey val id: Long, + @ColumnInfo(name = "text") var text: String, + @ColumnInfo(name = "attachments") var attachments: ArrayList) From 633f7cf5c0df6ba7975c648b571ec048b7c655a6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 18:02:07 +0100 Subject: [PATCH 23/57] create a db table for Messages too --- .../databases/MessagesDatabase.kt | 8 +++++++- .../smsmessenger/extensions/Context.kt | 3 +++ .../smsmessenger/helpers/Converters.kt | 16 ++++++++++++++++ .../smsmessenger/interfaces/MessagesDao.kt | 11 +++++++++++ .../smsmessenger/models/Message.kt | 19 +++++++++++++++++-- 5 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index cfbde698..c3064d34 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -11,11 +11,13 @@ import com.simplemobiletools.smsmessenger.helpers.Converters import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao +import com.simplemobiletools.smsmessenger.interfaces.MessagesDao import com.simplemobiletools.smsmessenger.models.Attachment import com.simplemobiletools.smsmessenger.models.Conversation +import com.simplemobiletools.smsmessenger.models.Message import com.simplemobiletools.smsmessenger.models.MessageAttachment -@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class], version = 2) +@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class], version = 2) @TypeConverters(Converters::class) abstract class MessagesDatabase : RoomDatabase() { @@ -25,6 +27,8 @@ abstract class MessagesDatabase : RoomDatabase() { abstract fun MessageAttachmentsDao(): MessageAttachmentsDao + abstract fun MessagesDao(): MessagesDao + companion object { private var db: MessagesDatabase? = null @@ -44,6 +48,8 @@ abstract class MessagesDatabase : RoomDatabase() { private val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER PRIMARY KEY NOT NULL, `body` TEXT NOT NULL, `type` INTEGER NOT NULL, `participants` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `thread` INTEGER NOT NULL, `is_mms` INTEGER NOT NULL, `attachment` TEXT, `sender_name` TEXT NOT NULL, `sender_photo_uri` TEXT NOT NULL, `subscription_id` INTEGER NOT NULL)") + database.execSQL("CREATE TABLE IF NOT EXISTS `message_attachments` (`id` INTEGER PRIMARY KEY NOT NULL, `text` TEXT NOT NULL, `attachments` TEXT NOT NULL)") database.execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") 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 b8627e35..142cd360 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -30,6 +30,7 @@ import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao +import com.simplemobiletools.smsmessenger.interfaces.MessagesDao import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver @@ -47,6 +48,8 @@ val Context.attachmentsDB: AttachmentsDao get() = getMessagessDB().AttachmentsDa val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB().MessageAttachmentsDao() +val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao() + fun Context.getMessages(threadId: Int): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt index 5c168683..27c94855 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt @@ -3,15 +3,31 @@ package com.simplemobiletools.smsmessenger.helpers import androidx.room.TypeConverter import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.models.Attachment +import com.simplemobiletools.smsmessenger.models.MessageAttachment class Converters { private val gson = Gson() private val attachmentType = object : TypeToken>() {}.type + private val simpleContactType = object : TypeToken>() {}.type + private val messageAttachmentType = object : TypeToken() {}.type @TypeConverter fun jsonToAttachmentList(value: String) = gson.fromJson>(value, attachmentType) @TypeConverter fun attachmentListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToSimpleContactList(value: String) = gson.fromJson>(value, simpleContactType) + + @TypeConverter + fun simpleContactListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToMessageAttachment(value: String) = gson.fromJson(value, messageAttachmentType) + + @TypeConverter + fun messageAttachmentToJson(messageAttachment: MessageAttachment) = gson.toJson(messageAttachment) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt new file mode 100644 index 00000000..cd8398ef --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.smsmessenger.interfaces + +import androidx.room.Dao +import androidx.room.Query +import com.simplemobiletools.smsmessenger.models.Message + +@Dao +interface MessagesDao { + @Query("SELECT * FROM messages") + fun getAll(): List +} 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 a0c2631d..f21a3269 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt @@ -1,10 +1,25 @@ package com.simplemobiletools.smsmessenger.models import android.provider.Telephony +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey import com.simplemobiletools.commons.models.SimpleContact +@Entity(tableName = "messages") data class Message( - val id: Long, val body: String, val type: Int, val participants: ArrayList, val date: Int, val read: Boolean, val thread: Int, - val isMMS: Boolean, val attachment: MessageAttachment?, var senderName: String, val senderPhotoUri: String, val subscriptionId: Int) : ThreadItem() { + @PrimaryKey val id: Long, + @ColumnInfo(name = "body") val body: String, + @ColumnInfo(name = "type") val type: Int, + @ColumnInfo(name = "participants") val participants: ArrayList, + @ColumnInfo(name = "date") val date: Int, + @ColumnInfo(name = "read") val read: Boolean, + @ColumnInfo(name = "thread") val thread: Int, + @ColumnInfo(name = "is_mms") val isMMS: Boolean, + @ColumnInfo(name = "attachment") val attachment: MessageAttachment?, + @ColumnInfo(name = "sender_name") var senderName: String, + @ColumnInfo(name = "sender_photo_uri") val senderPhotoUri: String, + @ColumnInfo(name = "subscription_id") val subscriptionId: Int) : ThreadItem() { + fun isReceivedMessage() = type == Telephony.Sms.MESSAGE_TYPE_INBOX } From e357b4a6590b1178232d2ba226695a9a719a72ba Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 19:27:21 +0100 Subject: [PATCH 24/57] insert messages in a local db at fetching --- .../smsmessenger/extensions/Context.kt | 7 +++++++ .../smsmessenger/helpers/Converters.kt | 4 ++-- .../smsmessenger/interfaces/MessagesDao.kt | 11 +++++++++++ 3 files changed, 20 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 142cd360..48f31694 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -105,6 +105,13 @@ fun Context.getMessages(threadId: Int): ArrayList { messages = messages.filter { it.participants.isNotEmpty() } .sortedWith(compareBy { it.date }.thenBy { it.id }).toMutableList() as ArrayList + // use a separate thread for saving messages in a db + Thread { + messages.chunked(30).forEach { currentMessages -> + messagesDB.insertMessages(*currentMessages.toTypedArray()) + } + }.start() + return messages } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt index 27c94855..b11cbeb3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Converters.kt @@ -11,7 +11,7 @@ class Converters { private val gson = Gson() private val attachmentType = object : TypeToken>() {}.type private val simpleContactType = object : TypeToken>() {}.type - private val messageAttachmentType = object : TypeToken() {}.type + private val messageAttachmentType = object : TypeToken() {}.type @TypeConverter fun jsonToAttachmentList(value: String) = gson.fromJson>(value, attachmentType) @@ -29,5 +29,5 @@ class Converters { fun jsonToMessageAttachment(value: String) = gson.fromJson(value, messageAttachmentType) @TypeConverter - fun messageAttachmentToJson(messageAttachment: MessageAttachment) = gson.toJson(messageAttachment) + fun messageAttachmentToJson(messageAttachment: MessageAttachment?) = gson.toJson(messageAttachment) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index cd8398ef..bb508011 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -1,11 +1,22 @@ 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.Message @Dao interface MessagesDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(message: Message) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertMessages(vararg message: Message) + @Query("SELECT * FROM messages") fun getAll(): List + + @Query("SELECT * FROM messages WHERE thread = :threadId") + fun getThreadMessages(threadId: Long): List } From 6405b7431f246874044572f4ecb6e8d58b6e749b Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 20:01:57 +0100 Subject: [PATCH 25/57] work with threadIds as Longs, not Ints --- .../smsmessenger/activities/MainActivity.kt | 8 +-- .../smsmessenger/activities/ThreadActivity.kt | 14 ++--- .../adapters/ConversationsAdapter.kt | 14 ++--- .../databases/MessagesDatabase.kt | 2 +- .../smsmessenger/extensions/Context.kt | 51 +++++++++---------- .../smsmessenger/interfaces/MessagesDao.kt | 2 +- .../smsmessenger/models/Conversation.kt | 2 +- .../smsmessenger/models/Message.kt | 2 +- .../receivers/DirectReplyReceiver.kt | 8 +-- .../receivers/MarkAsReadReceiver.kt | 6 +-- .../smsmessenger/receivers/MmsReceiver.kt | 4 +- .../smsmessenger/receivers/SmsReceiver.kt | 2 +- 12 files changed, 56 insertions(+), 59 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 4afcff73..e01db39b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -193,20 +193,20 @@ class MainActivity : SimpleActivity() { } conversations.forEach { clonedConversation -> - if (!cachedConversations.map { it.thread_id }.contains(clonedConversation.thread_id)) { + if (!cachedConversations.map { it.threadId }.contains(clonedConversation.threadId)) { conversationsDB.insertOrUpdate(clonedConversation) cachedConversations.add(clonedConversation) } } cachedConversations.forEach { cachedConversation -> - if (!conversations.map { it.thread_id }.contains(cachedConversation.thread_id)) { + if (!conversations.map { it.threadId }.contains(cachedConversation.threadId)) { conversationsDB.delete(cachedConversation.id!!) } } cachedConversations.forEach { cachedConversation -> - val conv = conversations.firstOrNull { it.thread_id == cachedConversation.thread_id && it.getStringToCompare() != cachedConversation.getStringToCompare() } + val conv = conversations.firstOrNull { it.threadId == cachedConversation.threadId && it.getStringToCompare() != cachedConversation.getStringToCompare() } if (conv != null) { conversationsDB.insertOrUpdate(conv) } @@ -224,7 +224,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).thread_id) + putExtra(THREAD_ID, (it as Conversation).threadId) putExtra(THREAD_TITLE, it.title) startActivity(this) } 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 931c9ad9..dac77c33 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -50,7 +50,7 @@ class ThreadActivity : SimpleActivity() { private val MIN_DATE_TIME_DIFF_SECS = 300 private val PICK_ATTACHMENT_INTENT = 1 - private var threadId = 0 + private var threadId = 0L private var currentSIMCardIndex = 0 private var isActivityVisible = false private var threadItems = ArrayList() @@ -72,7 +72,7 @@ class ThreadActivity : SimpleActivity() { return } - threadId = intent.getIntExtra(THREAD_ID, 0) + threadId = intent.getLongExtra(THREAD_ID, 0L) intent.getStringExtra(THREAD_TITLE)?.let { supportActionBar?.title = it } @@ -290,7 +290,7 @@ class ThreadActivity : SimpleActivity() { } } - val newThreadId = getThreadId(numbers).toInt() + val newThreadId = getThreadId(numbers) if (threadId != newThreadId) { Intent(this, ThreadActivity::class.java).apply { putExtra(THREAD_ID, newThreadId) @@ -430,7 +430,7 @@ class ThreadActivity : SimpleActivity() { private fun markAsUnread() { ensureBackgroundThread { - conversationsDB.markUnread(threadId.toLong()) + conversationsDB.markUnread(threadId) markThreadMessagesUnread(threadId) runOnUiThread { finish() @@ -474,7 +474,7 @@ class ThreadActivity : SimpleActivity() { if (!message.read) { hadUnreadItems = true markMessageRead(message.id, message.isMMS) - conversationsDB.markRead(threadId.toLong()) + conversationsDB.markRead(threadId) } if (i == cnt - 1 && message.type == Telephony.Sms.MESSAGE_TYPE_SENT) { @@ -595,7 +595,7 @@ class ThreadActivity : SimpleActivity() { } try { - transaction.sendNewMessage(message, threadId.toLong()) + transaction.sendNewMessage(message, threadId) thread_type_message.setText("") attachmentUris.clear() @@ -665,7 +665,7 @@ class ThreadActivity : SimpleActivity() { @Subscribe(threadMode = ThreadMode.ASYNC) fun refreshMessages(event: Events.RefreshMessages) { if (isActivityVisible) { - notificationManager.cancel(threadId) + notificationManager.cancel(threadId.hashCode()) } messages = getMessages(threadId) 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 9bf1df22..83e5814f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -63,9 +63,9 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis override fun getIsItemSelectable(position: Int) = true - override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.thread_id + override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.hashCode() - override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.thread_id == key } + override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.hashCode() == key } override fun onActionModeCreated() {} @@ -153,11 +153,11 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis return } - val conversationsToRemove = conversations.filter { selectedKeys.contains(it.thread_id) } as ArrayList + val conversationsToRemove = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList val positions = getSelectedItemPositions() conversationsToRemove.forEach { - activity.deleteConversation(it.thread_id) - activity.notificationManager.cancel(it.thread_id) + activity.deleteConversation(it.threadId) + activity.notificationManager.cancel(it.hashCode()) } try { @@ -193,7 +193,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis } } - private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.thread_id) } as ArrayList + private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) @@ -218,7 +218,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis private fun setupView(view: View, conversation: Conversation) { view.apply { - conversation_frame.isSelected = selectedKeys.contains(conversation.thread_id) + conversation_frame.isSelected = selectedKeys.contains(conversation.hashCode()) conversation_address.apply { text = conversation.title diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index c3064d34..a3740d2d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -48,7 +48,7 @@ abstract class MessagesDatabase : RoomDatabase() { private val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER PRIMARY KEY NOT NULL, `body` TEXT NOT NULL, `type` INTEGER NOT NULL, `participants` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `thread` INTEGER NOT NULL, `is_mms` INTEGER NOT NULL, `attachment` TEXT, `sender_name` TEXT NOT NULL, `sender_photo_uri` TEXT NOT NULL, `subscription_id` INTEGER NOT NULL)") + database.execSQL("CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER PRIMARY KEY NOT NULL, `body` TEXT NOT NULL, `type` INTEGER NOT NULL, `participants` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `thread_id` INTEGER NOT NULL, `is_mms` INTEGER NOT NULL, `attachment` TEXT, `sender_name` TEXT NOT NULL, `sender_photo_uri` TEXT NOT NULL, `subscription_id` INTEGER NOT NULL)") database.execSQL("CREATE TABLE IF NOT EXISTS `message_attachments` (`id` INTEGER PRIMARY KEY NOT NULL, `text` TEXT NOT NULL, `attachments` TEXT NOT NULL)") 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 48f31694..e5eea565 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -50,7 +50,7 @@ val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB() val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao() -fun Context.getMessages(threadId: Int): ArrayList { +fun Context.getMessages(threadId: Long): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( Sms._ID, @@ -93,7 +93,7 @@ fun Context.getMessages(threadId: Int): ArrayList { val photoUri = namePhoto.photoUri ?: "" val date = (cursor.getLongValue(Sms.DATE) / 1000).toInt() val read = cursor.getIntValue(Sms.READ) == 1 - val thread = cursor.getIntValue(Sms.THREAD_ID) + val thread = cursor.getLongValue(Sms.THREAD_ID) val subscriptionId = cursor.getIntValue(Sms.SUBSCRIPTION_ID) val participant = SimpleContact(0, 0, senderName, photoUri, arrayListOf(senderNumber), ArrayList(), ArrayList()) val isMMS = false @@ -105,18 +105,15 @@ fun Context.getMessages(threadId: Int): ArrayList { messages = messages.filter { it.participants.isNotEmpty() } .sortedWith(compareBy { it.date }.thenBy { it.id }).toMutableList() as ArrayList - // use a separate thread for saving messages in a db - Thread { - messages.chunked(30).forEach { currentMessages -> - messagesDB.insertMessages(*currentMessages.toTypedArray()) - } - }.start() + messages.chunked(30).forEach { currentMessages -> + messagesDB.insertMessages(*currentMessages.toTypedArray()) + } return messages } // as soon as a message contains multiple recipients it counts as an MMS instead of SMS -fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList { +fun Context.getMMS(threadId: Long? = null, sortOrder: String? = null): ArrayList { val uri = Mms.CONTENT_URI val projection = arrayOf( Mms._ID, @@ -141,13 +138,13 @@ fun Context.getMMS(threadId: Int? = null, sortOrder: String? = null): ArrayList< val messages = ArrayList() val contactsMap = HashMap() - val threadParticipants = HashMap>() + val threadParticipants = HashMap>() queryCursor(uri, projection, selection, selectionArgs, sortOrder, showErrors = true) { cursor -> val mmsId = cursor.getLongValue(Mms._ID) val type = cursor.getIntValue(Mms.MESSAGE_BOX) val date = cursor.getLongValue(Mms.DATE).toInt() val read = cursor.getIntValue(Mms.READ) == 1 - val threadId = cursor.getIntValue(Mms.THREAD_ID) + val threadId = cursor.getLongValue(Mms.THREAD_ID) val subscriptionId = cursor.getIntValue(Mms.SUBSCRIPTION_ID) val participants = if (threadParticipants.containsKey(threadId)) { threadParticipants[threadId]!! @@ -222,7 +219,7 @@ fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList< val simpleContactHelper = SimpleContactsHelper(this) val blockedNumbers = getBlockedNumbers() queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> - val id = cursor.getIntValue(Threads._ID) + val id = cursor.getLongValue(Threads._ID) var snippet = cursor.getStringValue(Threads.SNIPPET) ?: "" if (snippet.isEmpty()) { snippet = getThreadSnippet(id) @@ -300,7 +297,7 @@ fun Context.getLatestMMS(): Message? { return getMMS(sortOrder = sortOrder).firstOrNull() } -fun Context.getThreadSnippet(threadId: Int): String { +fun Context.getThreadSnippet(threadId: Long): String { val sortOrder = "${Mms.DATE} DESC LIMIT 1" val latestMms = getMMS(threadId, sortOrder).firstOrNull() var snippet = latestMms?.body ?: "" @@ -327,7 +324,7 @@ fun Context.getThreadSnippet(threadId: Int): String { return snippet } -fun Context.getThreadParticipants(threadId: Int, contactsMap: HashMap?): ArrayList { +fun Context.getThreadParticipants(threadId: Long, contactsMap: HashMap?): ArrayList { val uri = Uri.parse("${MmsSms.CONTENT_CONVERSATIONS_URI}?simple=true") val projection = arrayOf( ThreadsColumns.RECIPIENT_IDS @@ -495,7 +492,7 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L return newUri?.lastPathSegment?.toInt() ?: 0 } -fun Context.deleteConversation(threadId: Int) { +fun Context.deleteConversation(threadId: Long) { var uri = Sms.CONTENT_URI val selection = "${Sms.THREAD_ID} = ?" val selectionArgs = arrayOf(threadId.toString()) @@ -508,7 +505,7 @@ fun Context.deleteConversation(threadId: Int) { uri = Mms.CONTENT_URI contentResolver.delete(uri, selection, selectionArgs) - conversationsDB.deleteThreadId(threadId.toLong()) + conversationsDB.deleteThreadId(threadId) } fun Context.deleteMessage(id: Long, isMMS: Boolean) { @@ -533,7 +530,7 @@ fun Context.markMessageRead(id: Long, isMMS: Boolean) { contentResolver.update(uri, contentValues, selection, selectionArgs) } -fun Context.markThreadMessagesRead(threadId: Int) { +fun Context.markThreadMessagesRead(threadId: Long) { arrayOf(Sms.CONTENT_URI, Mms.CONTENT_URI).forEach { uri -> val contentValues = ContentValues().apply { put(Sms.READ, 1) @@ -545,7 +542,7 @@ fun Context.markThreadMessagesRead(threadId: Int) { } } -fun Context.markThreadMessagesUnread(threadId: Int) { +fun Context.markThreadMessagesUnread(threadId: Long) { arrayOf(Sms.CONTENT_URI, Mms.CONTENT_URI).forEach { uri -> val contentValues = ContentValues().apply { put(Sms.READ, 0) @@ -592,7 +589,7 @@ fun Context.getThreadId(addresses: Set): Long { } } -fun Context.showReceivedMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?) { +fun Context.showReceivedMessageNotification(address: String, body: String, threadId: Long, bitmap: Bitmap?) { val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { var sender = getNameAndPhotoFromPhoneNumber(address).name @@ -602,13 +599,13 @@ fun Context.showReceivedMessageNotification(address: String, body: String, threa } Handler(Looper.getMainLooper()).post { - showMessageNotification(address, body, threadID, bitmap, sender) + showMessageNotification(address, body, threadId, bitmap, sender) } } } @SuppressLint("NewApi") -fun Context.showMessageNotification(address: String, body: String, threadID: Int, bitmap: Bitmap?, sender: String) { +fun Context.showMessageNotification(address: String, body: String, threadId: Long, bitmap: Bitmap?, sender: String) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) if (isOreoPlus()) { @@ -630,14 +627,14 @@ fun Context.showMessageNotification(address: String, body: String, threadID: Int } val intent = Intent(this, ThreadActivity::class.java).apply { - putExtra(THREAD_ID, threadID) + putExtra(THREAD_ID, threadId) } - val pendingIntent = PendingIntent.getActivity(this, threadID, intent, PendingIntent.FLAG_UPDATE_CURRENT) + val pendingIntent = PendingIntent.getActivity(this, threadId.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT) val summaryText = getString(R.string.new_message) val markAsReadIntent = Intent(this, MarkAsReadReceiver::class.java).apply { action = MARK_AS_READ - putExtra(THREAD_ID, threadID) + putExtra(THREAD_ID, threadId) } val markAsReadPendingIntent = PendingIntent.getBroadcast(this, 0, markAsReadIntent, PendingIntent.FLAG_CANCEL_CURRENT) @@ -650,11 +647,11 @@ fun Context.showMessageNotification(address: String, body: String, threadID: Int .build() val replyIntent = Intent(this, DirectReplyReceiver::class.java).apply { - putExtra(THREAD_ID, threadID) + putExtra(THREAD_ID, threadId) putExtra(THREAD_NUMBER, address) } - val replyPendingIntent = PendingIntent.getBroadcast(applicationContext, threadID, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT) + val replyPendingIntent = PendingIntent.getBroadcast(applicationContext, threadId.hashCode(), replyIntent, PendingIntent.FLAG_UPDATE_CURRENT) replyAction = NotificationCompat.Action.Builder(R.drawable.ic_send_vector, replyLabel, replyPendingIntent) .addRemoteInput(remoteInput) .build() @@ -680,5 +677,5 @@ fun Context.showMessageNotification(address: String, body: String, threadID: Int builder.addAction(R.drawable.ic_check_vector, getString(R.string.mark_as_read), markAsReadPendingIntent) .setChannelId(NOTIFICATION_CHANNEL) - notificationManager.notify(threadID, builder.build()) + notificationManager.notify(threadId.hashCode(), builder.build()) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index bb508011..c8422f3e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -17,6 +17,6 @@ interface MessagesDao { @Query("SELECT * FROM messages") fun getAll(): List - @Query("SELECT * FROM messages WHERE thread = :threadId") + @Query("SELECT * FROM messages WHERE thread_id = :threadId") fun getThreadMessages(threadId: Long): 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 73e557c6..a3cf4789 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -8,7 +8,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "conversations", indices = [(Index(value = ["thread_id"], unique = true))]) data class Conversation( @PrimaryKey(autoGenerate = true) var id: Long?, - @ColumnInfo(name = "thread_id") var thread_id: Int, + @ColumnInfo(name = "thread_id") var threadId: Long, @ColumnInfo(name = "snippet") var snippet: String, @ColumnInfo(name = "date") var date: Int, @ColumnInfo(name = "read") var read: Boolean, 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 f21a3269..a9580099 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Message.kt @@ -14,7 +14,7 @@ data class Message( @ColumnInfo(name = "participants") val participants: ArrayList, @ColumnInfo(name = "date") val date: Int, @ColumnInfo(name = "read") val read: Boolean, - @ColumnInfo(name = "thread") val thread: Int, + @ColumnInfo(name = "thread_id") val threadId: Long, @ColumnInfo(name = "is_mms") val isMMS: Boolean, @ColumnInfo(name = "attachment") val attachment: MessageAttachment?, @ColumnInfo(name = "sender_name") var senderName: String, diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt index be837509..d4148c86 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/DirectReplyReceiver.kt @@ -21,7 +21,7 @@ import com.simplemobiletools.smsmessenger.helpers.THREAD_NUMBER class DirectReplyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val address = intent.getStringExtra(THREAD_NUMBER) - val threadId = intent.getIntExtra(THREAD_ID, 0) + val threadId = intent.getLongExtra(THREAD_ID, 0L) val msg = RemoteInput.getResultsFromIntent(intent).getCharSequence(REPLY).toString() val settings = Settings() @@ -31,7 +31,7 @@ class DirectReplyReceiver : BroadcastReceiver() { val message = com.klinker.android.send_message.Message(msg, address) try { - transaction.sendNewMessage(message, threadId.toLong()) + transaction.sendNewMessage(message, threadId) } catch (e: Exception) { context.showErrorToast(e) } @@ -41,11 +41,11 @@ class DirectReplyReceiver : BroadcastReceiver() { .setContentText(msg) .build() - context.notificationManager.notify(threadId, repliedNotification) + context.notificationManager.notify(threadId.hashCode(), repliedNotification) ensureBackgroundThread { context.markThreadMessagesRead(threadId) - context.conversationsDB.markRead(threadId.toLong()) + context.conversationsDB.markRead(threadId) } } } 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 3ef30ed4..4525f30d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MarkAsReadReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MarkAsReadReceiver.kt @@ -15,11 +15,11 @@ class MarkAsReadReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { when (intent.action) { MARK_AS_READ -> { - val threadId = intent.getIntExtra(THREAD_ID, 0) - context.notificationManager.cancel(threadId) + val threadId = intent.getLongExtra(THREAD_ID, 0L) + context.notificationManager.cancel(threadId.hashCode()) ensureBackgroundThread { context.markThreadMessagesRead(threadId) - context.conversationsDB.markRead(threadId.toLong()) + context.conversationsDB.markRead(threadId) context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) } } 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 53add47b..f19a826d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt @@ -33,8 +33,8 @@ class MmsReceiver : com.klinker.android.send_message.MmsReceivedReceiver() { } Handler(Looper.getMainLooper()).post { - context.showReceivedMessageNotification(address, mms.body, mms.thread, glideBitmap) - val conversation = context.getConversations(mms.thread.toLong()).firstOrNull() ?: return@post + context.showReceivedMessageNotification(address, mms.body, mms.threadId, glideBitmap) + val conversation = context.getConversations(mms.threadId).firstOrNull() ?: return@post ensureBackgroundThread { context.conversationsDB.insertOrUpdate(conversation) context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) 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 cfb61959..dabbdc3c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -42,7 +42,7 @@ class SmsReceiver : BroadcastReceiver() { context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) } - context.showReceivedMessageNotification(address, body, threadId.toInt(), null) + context.showReceivedMessageNotification(address, body, threadId, null) refreshMessages() } } From f97e3b048c5e5270e5c9696ee6c9fb8be04a1ba7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 20:46:56 +0100 Subject: [PATCH 26/57] move mms attachment size checking to a separate function --- .../smsmessenger/activities/ThreadActivity.kt | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 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 dac77c33..05d90eb8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -140,34 +140,7 @@ class ThreadActivity : SimpleActivity() { participants.add(contact) } - messages.filter { it.attachment != null }.forEach { - it.attachment!!.attachments.forEach { - try { - if (it.mimetype.startsWith("image/")) { - val fileOptions = BitmapFactory.Options() - fileOptions.inJustDecodeBounds = true - BitmapFactory.decodeStream(contentResolver.openInputStream(it.getUri()), null, fileOptions) - it.width = fileOptions.outWidth - it.height = fileOptions.outHeight - } else if (it.mimetype.startsWith("video/")) { - val metaRetriever = MediaMetadataRetriever() - metaRetriever.setDataSource(this, it.getUri()) - it.width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!.toInt() - it.height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!.toInt() - } - - if (it.width < 0) { - it.width = 0 - } - - if (it.height < 0) { - it.height = 0 - } - } catch (ignored: Exception) { - } - } - } - + setupAttachmentSizes() setupAdapter() runOnUiThread { val threadTitle = participants.getThreadTitle() @@ -315,6 +288,36 @@ class ThreadActivity : SimpleActivity() { } } + private fun setupAttachmentSizes() { + messages.filter { it.attachment != null }.forEach { + it.attachment!!.attachments.forEach { + try { + if (it.mimetype.startsWith("image/")) { + val fileOptions = BitmapFactory.Options() + fileOptions.inJustDecodeBounds = true + BitmapFactory.decodeStream(contentResolver.openInputStream(it.getUri()), null, fileOptions) + it.width = fileOptions.outWidth + it.height = fileOptions.outHeight + } else if (it.mimetype.startsWith("video/")) { + val metaRetriever = MediaMetadataRetriever() + metaRetriever.setDataSource(this, it.getUri()) + it.width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!.toInt() + it.height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!.toInt() + } + + if (it.width < 0) { + it.width = 0 + } + + if (it.height < 0) { + it.height = 0 + } + } catch (ignored: Exception) { + } + } + } + } + @SuppressLint("MissingPermission") private fun setupSIMSelector() { val availableSIMs = SubscriptionManager.from(this).activeSubscriptionInfoList ?: return From 189e60ac32edd09fd61b75e649605ee2b418c4b4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 21:03:12 +0100 Subject: [PATCH 27/57] setup some thread info sooner, before getting real messages --- .../smsmessenger/activities/ThreadActivity.kt | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 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 05d90eb8..1fd37ae1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -81,7 +81,10 @@ class ThreadActivity : SimpleActivity() { bus!!.register(this) handlePermission(PERMISSION_READ_PHONE_STATE) { if (it) { - setupThread() + setupButtons() + setupCachedMessages { + setupThread() + } } else { finish() } @@ -102,11 +105,7 @@ class ThreadActivity : SimpleActivity() { val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { messages = getMessages(threadId) - participants = if (messages.isEmpty()) { - getThreadParticipants(threadId, null) - } else { - messages.first().participants - } + setupParticipants() // check if no participant came from a privately stored contact in Simple Contacts privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) @@ -143,20 +142,9 @@ class ThreadActivity : SimpleActivity() { setupAttachmentSizes() setupAdapter() runOnUiThread { - val threadTitle = participants.getThreadTitle() - if (threadTitle.isNotEmpty()) { - supportActionBar?.title = participants.getThreadTitle() - } - - if (messages.isEmpty()) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - thread_type_message.requestFocus() - } - - setupSIMSelector() + setupThreadTitle() } } - setupButtons() } override fun onDestroy() { @@ -197,6 +185,25 @@ class ThreadActivity : SimpleActivity() { } } + private fun setupCachedMessages(callback: () -> Unit) { + ensureBackgroundThread { + messages = messagesDB.getThreadMessages(threadId).toMutableList() as ArrayList + setupParticipants() + setupAdapter() + + runOnUiThread { + if (messages.isEmpty()) { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + thread_type_message.requestFocus() + } + + setupThreadTitle() + setupSIMSelector() + callback() + } + } + } + private fun setupAdapter() { threadItems = getThreadItems() invalidateOptionsMenu() @@ -318,6 +325,23 @@ class ThreadActivity : SimpleActivity() { } } + private fun setupParticipants() { + if (participants.isEmpty()) { + participants = if (messages.isEmpty()) { + getThreadParticipants(threadId, null) + } else { + messages.first().participants + } + } + } + + private fun setupThreadTitle() { + val threadTitle = participants.getThreadTitle() + if (threadTitle.isNotEmpty()) { + supportActionBar?.title = participants.getThreadTitle() + } + } + @SuppressLint("MissingPermission") private fun setupSIMSelector() { val availableSIMs = SubscriptionManager.from(this).activeSubscriptionInfoList ?: return From 2f6ca409536ae6efe52cecdcf2a253874d4def08 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 21:13:32 +0100 Subject: [PATCH 28/57] compare cached messages with new ones asap, continue only if necessary --- .../smsmessenger/activities/ThreadActivity.kt | 9 +++++++++ .../simplemobiletools/smsmessenger/extensions/Context.kt | 4 ---- 2 files changed, 9 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 1fd37ae1..3faff799 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -104,7 +104,12 @@ class ThreadActivity : SimpleActivity() { private fun setupThread() { val privateCursor = getMyContactsCursor()?.loadInBackground() ensureBackgroundThread { + val cachedMessagesCode = messages.hashCode() messages = getMessages(threadId) + if (messages.hashCode() == cachedMessagesCode) { + return@ensureBackgroundThread + } + setupParticipants() // check if no participant came from a privately stored contact in Simple Contacts @@ -139,6 +144,10 @@ class ThreadActivity : SimpleActivity() { participants.add(contact) } + messages.chunked(30).forEach { currentMessages -> + messagesDB.insertMessages(*currentMessages.toTypedArray()) + } + setupAttachmentSizes() setupAdapter() runOnUiThread { 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 e5eea565..230bc686 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -105,10 +105,6 @@ fun Context.getMessages(threadId: Long): ArrayList { messages = messages.filter { it.participants.isNotEmpty() } .sortedWith(compareBy { it.date }.thenBy { it.id }).toMutableList() as ArrayList - messages.chunked(30).forEach { currentMessages -> - messagesDB.insertMessages(*currentMessages.toTypedArray()) - } - return messages } From ba57fe2a2218008ffeda6a1daebea81b36c449ff Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 21:30:02 +0100 Subject: [PATCH 29/57] properly mark read messages in the local db --- .../simplemobiletools/smsmessenger/extensions/Context.kt | 2 ++ .../smsmessenger/interfaces/MessagesDao.kt | 6 ++++++ 2 files changed, 8 insertions(+) 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 230bc686..d3beb6e2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -524,6 +524,7 @@ fun Context.markMessageRead(id: Long, isMMS: Boolean) { val selection = "${Sms._ID} = ?" val selectionArgs = arrayOf(id.toString()) contentResolver.update(uri, contentValues, selection, selectionArgs) + messagesDB.markRead(id) } fun Context.markThreadMessagesRead(threadId: Long) { @@ -536,6 +537,7 @@ fun Context.markThreadMessagesRead(threadId: Long) { val selectionArgs = arrayOf(threadId.toString()) contentResolver.update(uri, contentValues, selection, selectionArgs) } + messagesDB.markThreadRead(threadId) } fun Context.markThreadMessagesUnread(threadId: Long) { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index c8422f3e..4e25bd99 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -19,4 +19,10 @@ interface MessagesDao { @Query("SELECT * FROM messages WHERE thread_id = :threadId") fun getThreadMessages(threadId: Long): List + + @Query("UPDATE messages SET read = 1 WHERE id = :id") + fun markRead(id: Long) + + @Query("UPDATE messages SET read = 1 WHERE thread_id = :threadId") + fun markThreadRead(threadId: Long) } From 9aba85b9675293a1e60d91ae22c52e5c9b880259 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 22:00:36 +0100 Subject: [PATCH 30/57] add handling for local message deleting --- .../simplemobiletools/smsmessenger/extensions/Context.kt | 2 ++ .../smsmessenger/interfaces/MessagesDao.kt | 6 ++++++ 2 files changed, 8 insertions(+) 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 d3beb6e2..b0b08594 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -502,6 +502,7 @@ fun Context.deleteConversation(threadId: Long) { contentResolver.delete(uri, selection, selectionArgs) conversationsDB.deleteThreadId(threadId) + messagesDB.deleteThreadMessages(threadId) } fun Context.deleteMessage(id: Long, isMMS: Boolean) { @@ -510,6 +511,7 @@ fun Context.deleteMessage(id: Long, isMMS: Boolean) { val selectionArgs = arrayOf(id.toString()) try { contentResolver.delete(uri, selection, selectionArgs) + messagesDB.delete(id) } catch (e: Exception) { showErrorToast(e) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index 4e25bd99..70bf6510 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -25,4 +25,10 @@ interface MessagesDao { @Query("UPDATE messages SET read = 1 WHERE thread_id = :threadId") fun markThreadRead(threadId: Long) + + @Query("DELETE FROM messages WHERE id = :id") + fun delete(id: Long) + + @Query("DELETE FROM messages WHERE thread_id = :threadId") + fun deleteThreadMessages(threadId: Long) } From 733428da382b594ea7934af2e301ff9a6a63e849 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 22:56:10 +0100 Subject: [PATCH 31/57] store received messages in hte local db asap --- .../simplemobiletools/smsmessenger/extensions/Context.kt | 4 ++-- .../smsmessenger/receivers/SmsReceiver.kt | 8 +++++++- 2 files changed, 9 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 b0b08594..2ea2e950 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -471,7 +471,7 @@ fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto { return NamePhoto(number, null) } -fun Context.insertNewSMS(address: String, subject: String, body: String, date: Long, read: Int, threadId: Long, type: Int, subscriptionId: Int): Int { +fun Context.insertNewSMS(address: String, subject: String, body: String, date: Long, read: Int, threadId: Long, type: Int, subscriptionId: Int): Long { val uri = Sms.CONTENT_URI val contentValues = ContentValues().apply { put(Sms.ADDRESS, address) @@ -485,7 +485,7 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L } val newUri = contentResolver.insert(uri, contentValues) - return newUri?.lastPathSegment?.toInt() ?: 0 + return newUri?.lastPathSegment?.toLong() ?: 0L } fun Context.deleteConversation(threadId: Long) { 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 dabbdc3c..2a613685 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt @@ -8,8 +8,10 @@ import android.os.Looper import android.provider.Telephony import com.simplemobiletools.commons.extensions.isNumberBlocked import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.refreshMessages +import com.simplemobiletools.smsmessenger.models.Message class SmsReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { @@ -35,11 +37,15 @@ class SmsReceiver : BroadcastReceiver() { Handler(Looper.getMainLooper()).post { if (!context.isNumberBlocked(address)) { ensureBackgroundThread { - context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId) + val newMessageId = context.insertNewSMS(address, subject, body, date, read, threadId, type, subscriptionId) val conversation = context.getConversations(threadId).firstOrNull() ?: return@ensureBackgroundThread context.conversationsDB.insertOrUpdate(conversation) context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) + + val participant = SimpleContact(0, 0, address, "", arrayListOf(address), ArrayList(), ArrayList()) + val message = Message(newMessageId, body, type, arrayListOf(participant), (date / 1000).toInt(), false, threadId, false, null, address, "", subscriptionId) + context.messagesDB.insertOrUpdate(message) } context.showReceivedMessageNotification(address, body, threadId, null) From e116c5baa860a7e8cae2a2a2fb7534e6e9a023ef Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 23:17:20 +0100 Subject: [PATCH 32/57] properly store sent messages in local db --- .../smsmessenger/activities/ThreadActivity.kt | 6 ++++++ .../smsmessenger/interfaces/MessagesDao.kt | 3 +++ 2 files changed, 9 insertions(+) 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 3faff799..008ab485 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -704,7 +704,13 @@ class ThreadActivity : SimpleActivity() { notificationManager.cancel(threadId.hashCode()) } + val lastMaxId = messages.maxByOrNull { it.id }?.id ?: 0L messages = getMessages(threadId) + + messages.filter { !it.isReceivedMessage() && it.id > lastMaxId }.forEach { + messagesDB.insertOrIgnore(it) + } + setupAdapter() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index 70bf6510..629c3dfa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -11,6 +11,9 @@ interface MessagesDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrUpdate(message: Message) + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insertOrIgnore(message: Message): Long + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertMessages(vararg message: Message) From 2e8d96b94157ac648219de9bba69938a85e30284 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 23 Dec 2020 15:00:46 +0100 Subject: [PATCH 33/57] add better handling for the main screens scrollbar --- .../smsmessenger/activities/MainActivity.kt | 7 +++++++ 1 file changed, 7 insertions(+) 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 e01db39b..966e1755 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -86,6 +86,8 @@ class MainActivity : SimpleActivity() { updateTextColors(main_coordinator) no_conversations_placeholder_2.setTextColor(getAdjustedPrimaryColor()) no_conversations_placeholder_2.underlineText() + conversations_fastscroller.updatePrimaryColor() + conversations_fastscroller.updateBubbleColors() checkShortcut() } @@ -231,6 +233,11 @@ class MainActivity : SimpleActivity() { }.apply { conversations_list.adapter = this } + + conversations_fastscroller.setViews(conversations_list) { + val listItem = (conversations_list.adapter as? ConversationsAdapter)?.conversations?.getOrNull(it) + conversations_fastscroller.updateBubbleText(listItem?.title ?: "") + } } else { try { (currAdapter as ConversationsAdapter).updateConversations(conversations) From f6d59d32dfb65cf52a80ba667e4036f480882d5d Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 23 Dec 2020 15:04:13 +0100 Subject: [PATCH 34/57] updating kotlin --- app/build.gradle | 1 + build.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fcfc9561..ee81a2ea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,7 @@ dependencies { implementation 'com.klinkerapps:android-smsmms:5.2.6' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' implementation "me.leolin:ShortcutBadger:1.1.22" + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' kapt "androidx.room:room-compiler:2.2.6" implementation "androidx.room:room-runtime:2.2.6" diff --git a/build.gradle b/build.gradle index 4b5c3db4..b604e4eb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.20' + ext.kotlin_version = '1.4.21' repositories { google() jcenter() From 4614a0c28ada0f56ba6cb3cc7f81f17ba9cee65f Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 23 Dec 2020 15:08:32 +0100 Subject: [PATCH 35/57] update version to 5.6.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ee81a2ea..8c11d748 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 30 - versionCode 19 - versionName "5.5.1" + versionCode 20 + versionName "5.6.0" setProperty("archivesBaseName", "sms-messenger") } From a402241a03c35a4adc582c4a299af66a3e668ccc Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 23 Dec 2020 15:08:40 +0100 Subject: [PATCH 36/57] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/20.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/20.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d838e03..52005ba6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 5.6.0 *(2020-12-23)* +---------------------------- + + * Cache messages for better performance + * Add a scrollbar on the main screen + * Adding some stability and translation improvements + Version 5.5.1 *(2020-12-06)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/20.txt b/fastlane/metadata/android/en-US/changelogs/20.txt new file mode 100644 index 00000000..23576702 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/20.txt @@ -0,0 +1,3 @@ + * Cache messages for better performance + * Add a scrollbar on the main screen + * Adding some stability and translation improvements From a375ff82b9b2c4dd6c126646a5c2401930ca2867 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 24 Dec 2020 20:39:02 +0100 Subject: [PATCH 37/57] adding a crashfix at checking multiple SIM cards --- .../smsmessenger/activities/ThreadActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) 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 008ab485..3ceb1dcd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -152,6 +152,7 @@ class ThreadActivity : SimpleActivity() { setupAdapter() runOnUiThread { setupThreadTitle() + setupSIMSelector() } } } @@ -371,6 +372,10 @@ class ThreadActivity : SimpleActivity() { } } + if (numbers.isEmpty()) { + return + } + currentSIMCardIndex = availableSIMs.indexOfFirstOrNull { it.subscriptionId == config.getUseSIMIdAtNumber(numbers.first()) } ?: 0 thread_select_sim_icon.applyColorFilter(config.textColor) From 0157f8514408adeb8486231e6440948e8b48e32f Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 24 Dec 2020 20:43:48 +0100 Subject: [PATCH 38/57] update version to 5.6.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8c11d748..6eee78d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 30 - versionCode 20 - versionName "5.6.0" + versionCode 21 + versionName "5.6.1" setProperty("archivesBaseName", "sms-messenger") } From ef86833b82645cd87e3675987f0312785f67ca24 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 24 Dec 2020 20:43:55 +0100 Subject: [PATCH 39/57] updating changelog --- CHANGELOG.md | 5 +++++ fastlane/metadata/android/en-US/changelogs/21.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/21.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 52005ba6..0e271821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========== +Version 5.6.1 *(2020-12-24)* +---------------------------- + + * Fixing a crash at devices with multiple SIM cards + Version 5.6.0 *(2020-12-23)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/21.txt b/fastlane/metadata/android/en-US/changelogs/21.txt new file mode 100644 index 00000000..e5175d29 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/21.txt @@ -0,0 +1 @@ + * Fixing a crash at devices with multiple SIM cards From e92e3b81e1ea694bc50738381cc436d23bb54330 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 25 Dec 2020 16:21:19 +0100 Subject: [PATCH 40/57] fix a glitch at opening a thread from the New Conversation screen --- .../smsmessenger/activities/NewConversationActivity.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 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 31cf896c..ae831c2e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt @@ -8,10 +8,7 @@ import android.view.WindowManager import com.google.gson.Gson 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 +import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.adapters.ContactsAdapter @@ -194,7 +191,7 @@ class NewConversationActivity : SimpleActivity() { val numbers = phoneNumber.split(";").toSet() val number = if (numbers.size == 1) phoneNumber else Gson().toJson(numbers) Intent(this, ThreadActivity::class.java).apply { - putExtra(THREAD_ID, getThreadId(numbers).toInt()) + putExtra(THREAD_ID, getThreadId(numbers)) putExtra(THREAD_TITLE, name) putExtra(THREAD_TEXT, text) putExtra(THREAD_NUMBER, number) From 89b0e1e892ef4978aa61533aa0a205a18f28f6f2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 25 Dec 2020 16:32:19 +0100 Subject: [PATCH 41/57] update version to 5.6.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6eee78d3..1b23f3b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 30 - versionCode 21 - versionName "5.6.1" + versionCode 22 + versionName "5.6.2" setProperty("archivesBaseName", "sms-messenger") } From cd463d724d435567adc99702d956cbe1705b5c74 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 25 Dec 2020 16:32:26 +0100 Subject: [PATCH 42/57] updating changelog --- CHANGELOG.md | 5 +++++ fastlane/metadata/android/en-US/changelogs/22.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/22.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e271821..308bdda2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========== +Version 5.6.2 *(2020-12-25)* +---------------------------- + + * Fixed messages not being sent in some cases + Version 5.6.1 *(2020-12-24)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/22.txt b/fastlane/metadata/android/en-US/changelogs/22.txt new file mode 100644 index 00000000..42a9f1dd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/22.txt @@ -0,0 +1 @@ +Fixed messages not being sent in some cases From 4c6245a81d220e893fa9b239537aa731f414ccd6 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sat, 26 Dec 2020 16:42:05 +0100 Subject: [PATCH 43/57] 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 87c66bf6..f51c97f2 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -8,7 +8,7 @@ Geen opgeslagen berichten gevonden Een gesprek starten Beantwoorden - Show a character counter at writing messages + Teller voor het aantal tekens weergeven Nieuw gesprek From bf094745a9439daf1df08c17bad55c52293288cc Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 12:41:26 +0100 Subject: [PATCH 44/57] adding a new string to show during the initial message loading --- 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 | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-id/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-ml/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-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 16 files changed, 16 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fc05292e..1e546c26 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -9,6 +9,7 @@ Neuen Chat beginnen Antworten Show a character counter at writing messages + Loading messages… Neuer Chat diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7b4d27a0..128f0812 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -9,6 +9,7 @@ Έναρξη συνομιλίας Απάντηση Show a character counter at writing messages + Loading messages… Νέα συνομιλία diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2493646f..e77c9449 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -9,6 +9,7 @@ Inicia una conversación Responder Mostrar un contador de caracteres al escribir mensajes + Loading messages… Nueva conversación diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c5316090..fa911ae5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -9,6 +9,7 @@ Commencer une conversation Répondre Show a character counter at writing messages + Loading messages… Nouvelle conversation diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index ad4d5e19..eaff1fef 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -9,6 +9,7 @@ Mulailah percakapan Balas Tunjukkan penghitung karakter saat menulis pesan + Loading messages… Percakapan baru diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 548d090b..3435729b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -9,6 +9,7 @@ 会話を始める 返信 メッセージ入力中に文字カウントを表示する + Loading messages… 新しい会話 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 45372922..e7c0dfca 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -9,6 +9,7 @@ Pradėtipokalbį Reply Show a character counter at writing messages + Loading messages… Naujas pokalbis diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index c6b7dffc..e6e009fc 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -9,6 +9,7 @@ ഒരു സംഭാഷണം ആരംഭിക്കുക ഒരു സംഭാഷണം ആരംഭിക്കുക Show a character counter at writing messages + Loading messages… പുതിയ സംഭാഷണം diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f51c97f2..739c58e4 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -9,6 +9,7 @@ Een gesprek starten Beantwoorden Teller voor het aantal tekens weergeven + Loading messages… Nieuw gesprek diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 486115a1..836a59a7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -9,6 +9,7 @@ Iniciar uma conversa Responder Mostrar número de caracteres ao escrever a mensagem + Loading messages… Nova conversa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fa26fc6c..4971a2bd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -9,6 +9,7 @@ Начать переписку Ответ Показывать счётчик символов при написании сообщений + Loading messages… Новая переписка diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 48028ba9..eb981bd6 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -9,6 +9,7 @@ Začať konverzáciu Odpovedať Zobraziť počítadlo znakov pri písaní správ + Načítanie správ… Nová konverzácia diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 56eee7b0..8b9d9d3b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -9,6 +9,7 @@ Bir görüşme başlat Yanıtla Mesaj yazarken bir karakter sayacı göster + Loading messages… Yeni görüşme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f72883e8..724dfd40 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -9,6 +9,7 @@ Почати листування Відповідь Показувати кількість символів + Loading messages… Нове листування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 947cef63..997b3353 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -9,6 +9,7 @@ 开始一个对话 回复 Show a character counter at writing messages + Loading messages… 新的对话 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce68413e..f1e71191 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ Start a conversation Reply Show a character counter at writing messages + Loading messages… New conversation From 1c6d19c9864e825fd6c770323b4c0adae7fbc578 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 12:44:50 +0100 Subject: [PATCH 45/57] move Delete button at selecting a conversation in front --- app/src/main/res/menu/cab_conversations.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/menu/cab_conversations.xml b/app/src/main/res/menu/cab_conversations.xml index 3d73190f..113b5be4 100644 --- a/app/src/main/res/menu/cab_conversations.xml +++ b/app/src/main/res/menu/cab_conversations.xml @@ -1,6 +1,11 @@ + - From d1616d4997d704bba93533fe37a1f22bbe7d4e20 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 15:53:08 +0100 Subject: [PATCH 46/57] removing the id field at conversations, use thread_id --- .../smsmessenger/activities/MainActivity.kt | 4 +-- .../databases/MessagesDatabase.kt | 30 +++++++++++++++---- .../smsmessenger/extensions/ArrayList.kt | 3 -- .../smsmessenger/extensions/Context.kt | 2 +- .../interfaces/ConversationsDao.kt | 3 -- .../smsmessenger/models/Conversation.kt | 9 ++---- 6 files changed, 30 insertions(+), 21 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 966e1755..df50e27a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -203,12 +203,12 @@ class MainActivity : SimpleActivity() { cachedConversations.forEach { cachedConversation -> if (!conversations.map { it.threadId }.contains(cachedConversation.threadId)) { - conversationsDB.delete(cachedConversation.id!!) + conversationsDB.deleteThreadId(cachedConversation.threadId) } } cachedConversations.forEach { cachedConversation -> - val conv = conversations.firstOrNull { it.threadId == cachedConversation.threadId && it.getStringToCompare() != cachedConversation.getStringToCompare() } + val conv = conversations.firstOrNull { it.threadId == cachedConversation.threadId && it.toString() != cachedConversation.toString() } if (conv != null) { conversationsDB.insertOrUpdate(conv) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index a3740d2d..37e03e44 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -17,7 +17,7 @@ import com.simplemobiletools.smsmessenger.models.Conversation import com.simplemobiletools.smsmessenger.models.Message import com.simplemobiletools.smsmessenger.models.MessageAttachment -@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class], version = 2) +@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class], version = 3) @TypeConverters(Converters::class) abstract class MessagesDatabase : RoomDatabase() { @@ -39,6 +39,7 @@ abstract class MessagesDatabase : RoomDatabase() { db = Room.databaseBuilder(context.applicationContext, MessagesDatabase::class.java, "conversations.db") .fallbackToDestructiveMigration() .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_2_3) .build() } } @@ -48,12 +49,31 @@ abstract class MessagesDatabase : RoomDatabase() { private val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER PRIMARY KEY NOT NULL, `body` TEXT NOT NULL, `type` INTEGER NOT NULL, `participants` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `thread_id` INTEGER NOT NULL, `is_mms` INTEGER NOT NULL, `attachment` TEXT, `sender_name` TEXT NOT NULL, `sender_photo_uri` TEXT NOT NULL, `subscription_id` INTEGER NOT NULL)") + database.apply { + execSQL("CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER PRIMARY KEY NOT NULL, `body` TEXT NOT NULL, `type` INTEGER NOT NULL, `participants` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `thread_id` INTEGER NOT NULL, `is_mms` INTEGER NOT NULL, `attachment` TEXT, `sender_name` TEXT NOT NULL, `sender_photo_uri` TEXT NOT NULL, `subscription_id` INTEGER NOT NULL)") - database.execSQL("CREATE TABLE IF NOT EXISTS `message_attachments` (`id` INTEGER PRIMARY KEY NOT NULL, `text` TEXT NOT NULL, `attachments` TEXT NOT NULL)") + execSQL("CREATE TABLE IF NOT EXISTS `message_attachments` (`id` INTEGER PRIMARY KEY NOT NULL, `text` TEXT NOT NULL, `attachments` TEXT NOT NULL)") - database.execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") - database.execSQL("CREATE UNIQUE INDEX `index_attachments_message_id` ON `attachments` (`message_id`)") + execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") + execSQL("CREATE UNIQUE INDEX `index_attachments_message_id` ON `attachments` (`message_id`)") + } + } + } + + private val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(database: SupportSQLiteDatabase) { + database.apply { + execSQL("CREATE TABLE conversations_new (`thread_id` INTEGER NOT NULL PRIMARY KEY, `snippet` TEXT NOT NULL, `date` INTEGER NOT NULL, `read` INTEGER NOT NULL, `title` TEXT NOT NULL, `photo_uri` TEXT NOT NULL, `is_group_conversation` INTEGER NOT NULL, `phone_number` TEXT NOT NULL)") + + execSQL("INSERT OR IGNORE INTO conversations_new (thread_id, snippet, date, read, title, photo_uri, is_group_conversation, phone_number) " + + "SELECT thread_id, snippet, date, read, title, photo_uri, is_group_conversation, phone_number FROM conversations") + + execSQL("DROP TABLE conversations") + + execSQL("ALTER TABLE conversations_new RENAME TO conversations") + + execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_conversations_id` ON `conversations` (`thread_id`)") + } } } } 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 0ff90913..dfaf3202 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/ArrayList.kt @@ -2,8 +2,5 @@ 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 2ea2e950..0cd08cd6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -238,7 +238,7 @@ fun Context.getConversations(threadId: Long? = null, privateContacts: 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(null, id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first()) + val conversation = Conversation(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 index d50507f7..8980593d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -23,9 +23,6 @@ interface ConversationsDao { @Query("UPDATE conversations SET read = 0 WHERE thread_id = :threadId") fun markUnread(threadId: Long) - @Query("DELETE FROM conversations WHERE id = :id") - fun delete(id: Long) - @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 a3cf4789..fc5698f4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -7,8 +7,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "conversations", indices = [(Index(value = ["thread_id"], unique = true))]) data class Conversation( - @PrimaryKey(autoGenerate = true) var id: Long?, - @ColumnInfo(name = "thread_id") var threadId: Long, + @PrimaryKey @ColumnInfo(name = "thread_id") var threadId: Long, @ColumnInfo(name = "snippet") var snippet: String, @ColumnInfo(name = "date") var date: Int, @ColumnInfo(name = "read") var read: Boolean, @@ -16,8 +15,4 @@ 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 e7d8f703da0ac424a778a4428d9dcb3f6e5f4f6b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 15:57:23 +0100 Subject: [PATCH 47/57] require Simple Thank You for color customization --- app/build.gradle | 2 +- .../smsmessenger/activities/SettingsActivity.kt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1b23f3b1..bfc9ff95 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.32.8' + implementation 'com.simplemobiletools:commons:5.32.16' 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/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt index 680c3422..c8d6949e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt @@ -53,15 +53,16 @@ class SettingsActivity : SimpleActivity() { } private fun setupPurchaseThankYou() { - settings_purchase_thank_you_holder.beVisibleIf(!isThankYouInstalled()) + settings_purchase_thank_you_holder.beGoneIf(isOrWasThankYouInstalled()) settings_purchase_thank_you_holder.setOnClickListener { launchPurchaseThankYouIntent() } } private fun setupCustomizeColors() { + settings_customize_colors_label.text = getCustomizeColorsString() settings_customize_colors_holder.setOnClickListener { - startCustomizationActivity() + handleCustomizeColorsClick() } } From 1a8e8f9cf47a312ed0c8d84726ebf4e74bd97d12 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 16:06:45 +0100 Subject: [PATCH 48/57] show a Loading Messages placeholder text at first launch --- .../smsmessenger/activities/MainActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) 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 df50e27a..32a568fa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -222,6 +222,11 @@ class MainActivity : SimpleActivity() { no_conversations_placeholder.beVisibleIf(!hasConversations) no_conversations_placeholder_2.beVisibleIf(!hasConversations) + if (!hasConversations && config.appRunCount == 1) { + no_conversations_placeholder.text = getString(R.string.loading_messages) + no_conversations_placeholder_2.beGone() + } + val currAdapter = conversations_list.adapter if (currAdapter == null) { ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { From a63f4ce65ba0654f05489b20bc8782999a2745c5 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Wed, 30 Dec 2020 16:07:55 +0100 Subject: [PATCH 49/57] 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 739c58e4..4c55cd30 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -9,7 +9,7 @@ Een gesprek starten Beantwoorden Teller voor het aantal tekens weergeven - Loading messages… + Berichten laden… Nieuw gesprek From b8d3c6191f1d1aa16d8e14a6dbc8195018464ab3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 16:34:30 +0100 Subject: [PATCH 50/57] prefetch all messages at first app launch --- .../smsmessenger/activities/MainActivity.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 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 32a568fa..58550850 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -18,10 +18,7 @@ import com.simplemobiletools.commons.models.FAQItem 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.extensions.updateUnreadCountBadge +import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.THREAD_ID import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE import com.simplemobiletools.smsmessenger.models.Conversation @@ -213,6 +210,15 @@ class MainActivity : SimpleActivity() { conversationsDB.insertOrUpdate(conv) } } + + if (config.appRunCount == 1) { + conversations.map { it.threadId }.forEach { threadId -> + val messages = getMessages(threadId) + messages.chunked(30).forEach { currentMessages -> + messagesDB.insertMessages(*currentMessages.toTypedArray()) + } + } + } } } From 1c030dbcd1b486aa244ed013aca60ea47d50b3ea Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 16:39:30 +0100 Subject: [PATCH 51/57] update version to 5.7.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bfc9ff95..8cd28c2a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.simplemobiletools.smsmessenger" minSdkVersion 22 targetSdkVersion 30 - versionCode 22 - versionName "5.6.2" + versionCode 23 + versionName "5.7.0" setProperty("archivesBaseName", "sms-messenger") } From 0ae337289f3ce353f454fb05e9677b3b3c010553 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 30 Dec 2020 16:39:38 +0100 Subject: [PATCH 52/57] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/23.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/23.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 308bdda2..dd67cdce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 5.7.0 *(2020-12-30)* +---------------------------- + + * Prefetch all messages at first launch for better performance + * Require Simple Thank You for color customization + * Some stability, translation and UX improvements + Version 5.6.2 *(2020-12-25)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/23.txt b/fastlane/metadata/android/en-US/changelogs/23.txt new file mode 100644 index 00000000..e2b18ed9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/23.txt @@ -0,0 +1,3 @@ + * Prefetch all messages at first launch for better performance + * Require Simple Thank You for color customization + * Some stability, translation and UX improvements From 07091409e2c809d713e5c4ca417f50343f1c6a79 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 31 Dec 2020 16:14:06 +0100 Subject: [PATCH 53/57] use a capital letter at Send Message text hint --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1e546c26..fbfd70bd 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ Schlichter SMS Messenger SMS Messenger - schreibe eine Nachricht… + Schreibe eine Nachricht… Nachricht wurde nicht gesendet. Person hinzufügen Anhang From 94ff7eb6d6f6598c490697bcbb0510bda3b7c0c2 Mon Sep 17 00:00:00 2001 From: spkprs Date: Thu, 31 Dec 2020 18:38:41 +0200 Subject: [PATCH 54/57] Update strings.xml --- app/src/main/res/values-el/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 128f0812..5d40a5a4 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -8,8 +8,8 @@ Δεν βρέθηκαν αποθηκευμένες συνομιλίες Έναρξη συνομιλίας Απάντηση - Show a character counter at writing messages - Loading messages… + Εμφάνιση μετρητή χαρακτήρων κατά την πληκτρολόγηση μηνυμάτων + Φόρτωση μηνυμάτων… Νέα συνομιλία From 555399c31f0625791be3df0d1dd8c559207d72db Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Jan 2021 11:15:27 +0100 Subject: [PATCH 55/57] enable delivery reports at sending messages --- app/build.gradle | 2 +- .../simplemobiletools/smsmessenger/activities/ThreadActivity.kt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8cd28c2a..2d71ade9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.32.16' + implementation 'com.simplemobiletools:commons:5.32.19' 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/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 3ceb1dcd..43e73d62 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -609,6 +609,7 @@ class ThreadActivity : SimpleActivity() { val settings = Settings() settings.useSystemSending = true + settings.deliveryReports = true val SIMId = availableSIMCards.getOrNull(currentSIMCardIndex)?.subscriptionId if (SIMId != null) { From c8cbad7dde91d92edf407793e83f41c36bbf90dc Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Jan 2021 12:07:50 +0100 Subject: [PATCH 56/57] adding some new strings to be used in the future --- app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 6 ++++-- app/src/main/res/values-id/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-ml/strings.xml | 2 ++ app/src/main/res/values-nl/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 2 ++ app/src/main/res/values-uk/strings.xml | 2 ++ app/src/main/res/values-zh-rCN/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 16 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fbfd70bd..360c46e5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -10,6 +10,8 @@ Antworten Show a character counter at writing messages Loading messages… + Sender doesn\'t support replies + Draft Neuer Chat diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 5d40a5a4..e6e01354 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -10,6 +10,8 @@ Απάντηση Εμφάνιση μετρητή χαρακτήρων κατά την πληκτρολόγηση μηνυμάτων Φόρτωση μηνυμάτων… + Sender doesn\'t support replies + Draft Νέα συνομιλία diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e77c9449..f9186816 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -10,6 +10,8 @@ Responder Mostrar un contador de caracteres al escribir mensajes Loading messages… + Sender doesn\'t support replies + Draft Nueva conversación diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fa911ae5..99a6042e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ Simple SMS Messenger SMS Messenger - Écrivez un message... + Écrivez un message… Le message n\'a pas été envoyé. Ajouter une personne Pièce jointe @@ -10,10 +10,12 @@ Répondre Show a character counter at writing messages Loading messages… + Sender doesn\'t support replies + Draft Nouvelle conversation - Ajouter un contact ou un numéro... + Ajouter un contact ou un numéro… Suggestions diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index eaff1fef..3e07db4b 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -10,6 +10,8 @@ Balas Tunjukkan penghitung karakter saat menulis pesan Loading messages… + Sender doesn\'t support replies + Draft Percakapan baru diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3435729b..8923d612 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -10,6 +10,8 @@ 返信 メッセージ入力中に文字カウントを表示する Loading messages… + Sender doesn\'t support replies + Draft 新しい会話 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index e7c0dfca..1ed59780 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -10,6 +10,8 @@ Reply Show a character counter at writing messages Loading messages… + Sender doesn\'t support replies + Draft Naujas pokalbis diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index e6e009fc..41ee1210 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -10,6 +10,8 @@ ഒരു സംഭാഷണം ആരംഭിക്കുക Show a character counter at writing messages Loading messages… + Sender doesn\'t support replies + Draft പുതിയ സംഭാഷണം diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4c55cd30..9b5f1be5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -10,6 +10,8 @@ Beantwoorden Teller voor het aantal tekens weergeven Berichten laden… + Sender doesn\'t support replies + Draft Nieuw gesprek diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 836a59a7..916a751a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -10,6 +10,8 @@ Responder Mostrar número de caracteres ao escrever a mensagem Loading messages… + Sender doesn\'t support replies + Draft Nova conversa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4971a2bd..aa41ac62 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -10,6 +10,8 @@ Ответ Показывать счётчик символов при написании сообщений Loading messages… + Sender doesn\'t support replies + Draft Новая переписка diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index eb981bd6..4cbc0287 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -10,6 +10,8 @@ Odpovedať Zobraziť počítadlo znakov pri písaní správ Načítanie správ… + Sender doesn\'t support replies + Koncept Nová konverzácia diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8b9d9d3b..9db7b118 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -10,6 +10,8 @@ Yanıtla Mesaj yazarken bir karakter sayacı göster Loading messages… + Sender doesn\'t support replies + Draft Yeni görüşme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 724dfd40..801e4b33 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -10,6 +10,8 @@ Відповідь Показувати кількість символів Loading messages… + Sender doesn\'t support replies + Draft Нове листування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 997b3353..1f052ffd 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -10,6 +10,8 @@ 回复 Show a character counter at writing messages Loading messages… + Sender doesn\'t support replies + Draft 新的对话 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1e71191..20e2416c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,8 @@ Reply Show a character counter at writing messages Loading messages… + Sender doesn\'t support replies + Draft New conversation From 7e68f561eb2e6f54038a965f20392a0c4ed1173d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Jan 2021 12:18:44 +0100 Subject: [PATCH 57/57] adding one more string for sending a message, before delivery --- 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 | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-id/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-ml/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-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 16 files changed, 16 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 360c46e5..520c5be2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Neuer Chat diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e6e01354..1132b47a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -12,6 +12,7 @@ Φόρτωση μηνυμάτων… Sender doesn\'t support replies Draft + Sending… Νέα συνομιλία diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f9186816..3066aa3e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Nueva conversación diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 99a6042e..552ff722 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Nouvelle conversation diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 3e07db4b..b7e12b7c 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Percakapan baru diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8923d612..df1b2f23 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… 新しい会話 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1ed59780..c02ca2a3 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Naujas pokalbis diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 41ee1210..5f4eb165 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… പുതിയ സംഭാഷണം diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 9b5f1be5..f5e7e0a9 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -12,6 +12,7 @@ Berichten laden… Sender doesn\'t support replies Draft + Sending… Nieuw gesprek diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 916a751a..c263baf6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Nova conversa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index aa41ac62..d82b42f4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Новая переписка diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4cbc0287..89cc373b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -12,6 +12,7 @@ Načítanie správ… Sender doesn\'t support replies Koncept + Odosiela sa… Nová konverzácia diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9db7b118..9e42b548 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Yeni görüşme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 801e4b33..3b23c2c4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… Нове листування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1f052ffd..50d5077c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… 新的对话 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 20e2416c..444dd7f8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,7 @@ Loading messages… Sender doesn\'t support replies Draft + Sending… New conversation