From ef1eebc354b711184fa228ea7b83e4695ece1425 Mon Sep 17 00:00:00 2001 From: Sultan ahamar Date: Fri, 2 Apr 2021 06:18:51 +0530 Subject: [PATCH 1/4] Test version that uses opencontacts for contacts source --- .../moez/QKSMS/mapper/CursorToContactImpl.kt | 3 +- presentation/build.gradle | 5 ++ presentation/src/main/AndroidManifest.xml | 2 +- .../src/noAnalytics/AndroidManifest.xml | 51 +++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 presentation/src/noAnalytics/AndroidManifest.xml diff --git a/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt b/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt index 5b618d032..ff049a9d4 100644 --- a/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt @@ -20,6 +20,7 @@ package com.moez.QKSMS.mapper import android.content.Context import android.database.Cursor +import android.net.Uri import android.provider.ContactsContract.CommonDataKinds.Phone import com.moez.QKSMS.manager.PermissionManager import com.moez.QKSMS.model.Contact @@ -32,7 +33,7 @@ class CursorToContactImpl @Inject constructor( ) : CursorToContact { companion object { - val URI = Phone.CONTENT_URI + val URI = Uri.parse("content://opencontacts.open.com.opencontacts.ContactsProvider")!! val PROJECTION = arrayOf( Phone._ID, Phone.LOOKUP_KEY, diff --git a/presentation/build.gradle b/presentation/build.gradle index 7240ab02b..5f7ec152c 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -49,6 +49,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } + debug { + applicationIdSuffix '.debug' + debuggable true + minifyEnabled false + } } compileOptions { diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index bdd875b43..114eaa387 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b86fc1f07aa4563fad700760d34db45db327caa8 Mon Sep 17 00:00:00 2001 From: Sultan ahamar Date: Sun, 21 Aug 2022 19:23:56 +0530 Subject: [PATCH 2/4] Removes sms from Android store once saved in QKSMS --- .../repository/AndroidMessagesRepository.kt | 32 +++++++++++++++++++ .../com/moez/QKSMS/interactor/ReceiveSms.kt | 6 ++-- .../repository/AndroidMessagesRepository.kt | 7 ++++ .../com/moez/QKSMS/injection/AppModule.kt | 6 ++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 data/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt create mode 100644 domain/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt diff --git a/data/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt b/data/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt new file mode 100644 index 000000000..fc561713a --- /dev/null +++ b/data/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt @@ -0,0 +1,32 @@ +package com.moez.QKSMS.repository + +import android.content.Context +import android.provider.Telephony +import android.telephony.SmsMessage +import com.google.android.mms.util_alt.SqliteWrapper +import io.reactivex.Single +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AndroidMessagesRepositoryImpl @Inject constructor( + private val context: Context) + : AndroidMessagesRepository { + + override fun deleteMessage(messages: Array) { + val senderNumbers = messages + .map { it.displayOriginatingAddress } + .distinct() + .toTypedArray() + + Single.just(1) + .delay(3, TimeUnit.SECONDS) + .subscribe { x -> + senderNumbers.forEach { + val delete = SqliteWrapper.delete(context, context.contentResolver, Telephony.Sms.CONTENT_URI, "${Telephony.Sms.ADDRESS} = ?", arrayOf(it)) + println("yolo $delete") + } + } + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt b/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt index c8fbeddbb..a8c3aace9 100644 --- a/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt +++ b/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt @@ -23,6 +23,7 @@ import com.moez.QKSMS.blocking.BlockingClient import com.moez.QKSMS.extensions.mapNotNull import com.moez.QKSMS.manager.NotificationManager import com.moez.QKSMS.manager.ShortcutManager +import com.moez.QKSMS.repository.AndroidMessagesRepository import com.moez.QKSMS.repository.ConversationRepository import com.moez.QKSMS.repository.MessageRepository import com.moez.QKSMS.util.Preferences @@ -37,7 +38,8 @@ class ReceiveSms @Inject constructor( private val messageRepo: MessageRepository, private val notificationManager: NotificationManager, private val updateBadge: UpdateBadge, - private val shortcutManager: ShortcutManager + private val shortcutManager: ShortcutManager, + private val androidMessagesRepository: AndroidMessagesRepository ) : Interactor() { class Params(val subId: Int, val messages: Array) @@ -74,7 +76,7 @@ class ReceiveSms @Inject constructor( is BlockingClient.Action.Unblock -> conversationRepo.markUnblocked(message.threadId) else -> Unit } - + androidMessagesRepository.deleteMessage(it.messages) message } .doOnNext { message -> diff --git a/domain/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt new file mode 100644 index 000000000..fc6ee1686 --- /dev/null +++ b/domain/src/main/java/com/moez/QKSMS/repository/AndroidMessagesRepository.kt @@ -0,0 +1,7 @@ +package com.moez.QKSMS.repository + +import android.telephony.SmsMessage + +interface AndroidMessagesRepository { + fun deleteMessage(messages: Array) +} \ No newline at end of file diff --git a/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt b/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt index afab6678c..b4bf8bd57 100644 --- a/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt +++ b/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt @@ -84,6 +84,8 @@ import com.moez.QKSMS.repository.ScheduledMessageRepository import com.moez.QKSMS.repository.ScheduledMessageRepositoryImpl import com.moez.QKSMS.repository.SyncRepository import com.moez.QKSMS.repository.SyncRepositoryImpl +import com.moez.QKSMS.repository.AndroidMessagesRepository +import com.moez.QKSMS.repository.AndroidMessagesRepositoryImpl import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import dagger.Module @@ -217,4 +219,8 @@ class AppModule(private var application: Application) { @Provides fun provideSyncRepository(repository: SyncRepositoryImpl): SyncRepository = repository + @Provides + fun provideAndroidMessagesRepository(repository: AndroidMessagesRepositoryImpl): AndroidMessagesRepository = repository + + } \ No newline at end of file From 16c1d605a8950454edb78b6ded2f44ba667bd58e Mon Sep 17 00:00:00 2001 From: Sultan ahamar Date: Sun, 21 Aug 2022 19:27:48 +0530 Subject: [PATCH 3/4] Remove opencontacts contact sync uri --- .../src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt b/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt index ff049a9d4..5b618d032 100644 --- a/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt @@ -20,7 +20,6 @@ package com.moez.QKSMS.mapper import android.content.Context import android.database.Cursor -import android.net.Uri import android.provider.ContactsContract.CommonDataKinds.Phone import com.moez.QKSMS.manager.PermissionManager import com.moez.QKSMS.model.Contact @@ -33,7 +32,7 @@ class CursorToContactImpl @Inject constructor( ) : CursorToContact { companion object { - val URI = Uri.parse("content://opencontacts.open.com.opencontacts.ContactsProvider")!! + val URI = Phone.CONTENT_URI val PROJECTION = arrayOf( Phone._ID, Phone.LOOKUP_KEY, From 82f9b12f9add38f65f1055dcac35d6ca1fd799d8 Mon Sep 17 00:00:00 2001 From: Sultan ahamar Date: Thu, 25 Aug 2022 19:32:48 +0530 Subject: [PATCH 4/4] Fixed every message being in its own thread Also removed sync from happening automatically when default messaging app changes --- .../QKSMS/receiver/DefaultSmsChangedReceiver.kt | 8 ++++---- .../moez/QKSMS/repository/MessageRepositoryImpl.kt | 9 +++++++-- .../com/moez/QKSMS/feature/main/MainViewModel.kt | 14 +++++++------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/data/src/main/java/com/moez/QKSMS/receiver/DefaultSmsChangedReceiver.kt b/data/src/main/java/com/moez/QKSMS/receiver/DefaultSmsChangedReceiver.kt index 8f3b2d9c1..b63075176 100644 --- a/data/src/main/java/com/moez/QKSMS/receiver/DefaultSmsChangedReceiver.kt +++ b/data/src/main/java/com/moez/QKSMS/receiver/DefaultSmsChangedReceiver.kt @@ -38,10 +38,10 @@ class DefaultSmsChangedReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { AndroidInjection.inject(this, context) - if (intent.getBooleanExtra(Telephony.Sms.Intents.EXTRA_IS_DEFAULT_SMS_APP, false)) { - val pendingResult = goAsync() - syncMessages.execute(Unit) { pendingResult.finish() } - } +// if (intent.getBooleanExtra(Telephony.Sms.Intents.EXTRA_IS_DEFAULT_SMS_APP, false)) { +// val pendingResult = goAsync() +// syncMessages.execute(Unit) { pendingResult.finish() } +// } } } \ No newline at end of file diff --git a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt index a5438d346..3f736b2ba 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt @@ -66,7 +66,6 @@ import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException -import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton @@ -556,6 +555,12 @@ class MessageRepositoryImpl @Inject constructor( } override fun insertReceivedSms(subId: Int, address: String, body: String, sentTime: Long): Message { + var extractedThreadId = Realm.getDefaultInstance() + .where(Message::class.java) + .contains("address", address) + .contains("type", "sms") + .findFirst() + ?.threadId ?: (TelephonyCompat.getOrCreateThreadId(context, address)); // Insert the message to Realm val message = Message().apply { @@ -566,7 +571,7 @@ class MessageRepositoryImpl @Inject constructor( this.subId = subId id = messageIds.newId() - threadId = TelephonyCompat.getOrCreateThreadId(context, address) + threadId = extractedThreadId boxId = Sms.MESSAGE_TYPE_INBOX type = "sms" read = activeConversationManager.getActiveConversation() == threadId diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt index e4fec32bd..68b0252b6 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt @@ -150,13 +150,13 @@ class MainViewModel @Inject constructor( .autoDisposable(view.scope()) .subscribe() - // If we go from not having all permissions to having them, sync messages - permissions - .skip(1) - .filter { it.first && it.second && it.third } - .take(1) - .autoDisposable(view.scope()) - .subscribe { syncMessages.execute(Unit) } +// // If we go from not having all permissions to having them, sync messages +// permissions +// .skip(1) +// .filter { it.first && it.second && it.third } +// .take(1) +// .autoDisposable(view.scope()) +// .subscribe { syncMessages.execute(Unit) } // Launch screen from intent view.onNewIntentIntent