diff --git a/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt index f07aab192..2d48fbb0c 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt @@ -82,6 +82,15 @@ class ContactRepositoryImpl @Inject constructor( } } + override fun getUnmanagedAllContacts(): List { + val realm = Realm.getDefaultInstance() + + return realm + .where(Contact::class.java) + .findAll() + .map { realm.copyFromRealm(it) } + } + override fun getUnmanagedContacts(starred: Boolean): Observable> { val realm = Realm.getDefaultInstance() diff --git a/domain/src/main/java/com/moez/QKSMS/repository/ContactRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/ContactRepository.kt index a78620a5e..88341465f 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/ContactRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/ContactRepository.kt @@ -33,6 +33,8 @@ interface ContactRepository { fun getUnmanagedContact(lookupKey: String): Contact? + fun getUnmanagedAllContacts(): List + fun getUnmanagedContacts(starred: Boolean = false): Observable> fun getUnmanagedContactGroups(): Observable> diff --git a/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt b/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt index 86a99abce..ff43a3c81 100644 --- a/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt +++ b/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt @@ -107,6 +107,7 @@ class Preferences @Inject constructor( val textSize = rxPrefs.getInteger("textSize", TEXT_SIZE_NORMAL) val blockingManager = rxPrefs.getInteger("blockingManager", BLOCKING_MANAGER_QKSMS) val drop = rxPrefs.getBoolean("drop", false) + val silentNotContact = rxPrefs.getBoolean("silentNotContact", false) val notifAction1 = rxPrefs.getInteger("notifAction1", NOTIFICATION_ACTION_READ) val notifAction2 = rxPrefs.getInteger("notifAction2", NOTIFICATION_ACTION_REPLY) val notifAction3 = rxPrefs.getInteger("notifAction3", NOTIFICATION_ACTION_NONE) diff --git a/presentation/src/main/java/com/moez/QKSMS/common/util/NotificationManagerImpl.kt b/presentation/src/main/java/com/moez/QKSMS/common/util/NotificationManagerImpl.kt index f3fee9f26..ee4bb43e6 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/util/NotificationManagerImpl.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/util/NotificationManagerImpl.kt @@ -52,6 +52,7 @@ import dev.octoshrimpy.quik.receiver.MarkReadReceiver import dev.octoshrimpy.quik.receiver.MarkSeenReceiver import dev.octoshrimpy.quik.receiver.RemoteMessagingReceiver import dev.octoshrimpy.quik.receiver.SpeakThreadsReceiver +import dev.octoshrimpy.quik.repository.ContactRepository import dev.octoshrimpy.quik.repository.ConversationRepository import dev.octoshrimpy.quik.repository.MessageRepository import dev.octoshrimpy.quik.util.GlideApp @@ -70,7 +71,8 @@ class NotificationManagerImpl @Inject constructor( private val prefs: Preferences, private val messageRepo: MessageRepository, private val permissions: PermissionManager, - private val phoneNumberUtils: PhoneNumberUtils + private val phoneNumberUtils: PhoneNumberUtils, + private val contactRepo: ContactRepository, ) : dev.octoshrimpy.quik.manager.NotificationManager { companion object { @@ -145,12 +147,28 @@ class NotificationManagerImpl @Inject constructor( .setAutoCancel(true) .setContentIntent(contentPI) .setDeleteIntent(seenPI) - .setSound(ringtone) .setLights(Color.WHITE, 500, 2000) .setWhen(conversation.lastMessage?.date ?: System.currentTimeMillis()) .setVibrate(if (prefs.vibration(threadId).get()) VIBRATE_PATTERN else longArrayOf(0)) - // Tell the notification if it's a group message + // if preference set to silence notifications if no recipients in contacts + if (prefs.silentNotContact.get() && run { + val msgRecipientNumbers = conversation.recipients.map { it.address } + + // true if any message recipients are in device's contacts + !contactRepo + .getUnmanagedAllContacts() + .flatMap { it.numbers } + .map { it.address } + .any { contactNumber -> + msgRecipientNumbers.any { phoneNumberUtils.compare(contactNumber, it) } + } + }) + notification.setSilent(true) + else + notification.setSound(ringtone) + + // Tell the notification if it's a group message val messagingStyle = NotificationCompat.MessagingStyle("Me") if (conversation.recipients.size >= 2) { messagingStyle.isGroupConversation = true diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsActivity.kt b/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsActivity.kt index 1a5d4cd2e..37ecdbf50 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsActivity.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsActivity.kt @@ -99,6 +99,8 @@ class NotificationPrefsActivity : QkThemedActivity(), NotificationPrefsView { previews.summary = state.previewSummary previewModeDialog.adapter.selectedItem = state.previewId wake.checkbox.isChecked = state.wakeEnabled + silentNotContact.checkbox.isChecked = state.silentNotContact + silentNotContact.isVisible = state.threadId == 0L vibration.checkbox.isChecked = state.vibrationEnabled ringtone.summary = state.ringtoneName diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsState.kt b/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsState.kt index 65799cc0e..85b7ca814 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsState.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsState.kt @@ -28,6 +28,7 @@ data class NotificationPrefsState( val previewSummary: String = "", val previewId: Int = Preferences.NOTIFICATION_PREVIEWS_ALL, val wakeEnabled: Boolean = false, + val silentNotContact: Boolean = false, val action1Summary: String = "", val action2Summary: String = "", val action3Summary: String = "", diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsViewModel.kt index 405d0bdfe..39b531bb5 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/notificationprefs/NotificationPrefsViewModel.kt @@ -79,6 +79,9 @@ class NotificationPrefsViewModel @Inject constructor( disposables += wake.asObservable() .subscribe { enabled -> newState { copy(wakeEnabled = enabled) } } + disposables += prefs.silentNotContact.asObservable() + .subscribe { enabled -> newState { copy(silentNotContact = enabled) } } + disposables += vibration.asObservable() .subscribe { enabled -> newState { copy(vibrationEnabled = enabled) } } @@ -113,6 +116,8 @@ class NotificationPrefsViewModel @Inject constructor( R.id.wake -> wake.set(!wake.get()) + R.id.silentNotContact -> prefs.silentNotContact.set(!prefs.silentNotContact.get()) + R.id.vibration -> vibration.set(!vibration.get()) R.id.ringtone -> view.showRingtonePicker(ringtone.get().takeIf { it.isNotEmpty() }?.let(Uri::parse)) diff --git a/presentation/src/main/res/layout/notification_prefs_activity.xml b/presentation/src/main/res/layout/notification_prefs_activity.xml index 2b8db770e..b72660859 100644 --- a/presentation/src/main/res/layout/notification_prefs_activity.xml +++ b/presentation/src/main/res/layout/notification_prefs_activity.xml @@ -70,7 +70,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:title="@string/settings_notification_previews_title" - tools:summary="Show name and message" /> + tools:summary="@string/settings_notification_previews_summary" /> + + Button 2 Button 3 Notification previews + Show name and message Wake screen + Silent if not a contact + Silences notifications for messages without recipients in your contacts Vibration Sound None