diff --git a/sphinx/activity/main/activitymain/build.gradle b/sphinx/activity/main/activitymain/build.gradle index 340eb3b787..73e1284d6d 100644 --- a/sphinx/activity/main/activitymain/build.gradle +++ b/sphinx/activity/main/activitymain/build.gradle @@ -65,6 +65,7 @@ dependencies { implementation project(path: ':sphinx:screens-detail:common:detail-resources') implementation project(path: ':sphinx:application:data:concepts:repositories:concept-repository-actions') implementation project(path: ':sphinx:application:data:concepts:repositories:concept-repository-feed') + implementation project(path: ':sphinx:application:data:concepts:concept-sphinx-notification-manager') api project(path: ':sphinx:screens-detail:add-friend:add-friend') api project(path: ':sphinx:screens-detail:camera:camera') diff --git a/sphinx/activity/main/activitymain/src/main/java/chat/sphinx/activitymain/MainActivity.kt b/sphinx/activity/main/activitymain/src/main/java/chat/sphinx/activitymain/MainActivity.kt index ba64985afd..e58030a4f1 100644 --- a/sphinx/activity/main/activitymain/src/main/java/chat/sphinx/activitymain/MainActivity.kt +++ b/sphinx/activity/main/activitymain/src/main/java/chat/sphinx/activitymain/MainActivity.kt @@ -22,11 +22,13 @@ import chat.sphinx.activitymain.ui.MainViewState import chat.sphinx.activitymain.ui.MotionLayoutNavigationActivity import chat.sphinx.insetter_activity.InsetPadding import chat.sphinx.insetter_activity.InsetterActivity +import chat.sphinx.notification.SphinxNotificationManager import dagger.hilt.android.AndroidEntryPoint import dev.chrisbanes.insetter.applyInsetter import io.matthewnelson.android_feature_navigation.requests.PopBackStack import io.matthewnelson.android_feature_viewmodel.updateViewState import kotlinx.coroutines.launch +import javax.inject.Inject import chat.sphinx.resources.R as R_common @@ -41,6 +43,9 @@ class MainActivity: MotionLayoutNavigationActivity< { override val binding: ActivityMainBinding by viewBinding(ActivityMainBinding::bind) + @Inject + lateinit var sphinxNotificationManager: SphinxNotificationManager + private var sessionDepth = 0 override val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { @@ -71,6 +76,7 @@ class MainActivity: MotionLayoutNavigationActivity< private var statusBarInsets: InsetPadding? = null private var navigationBarInsets: InsetPadding? = null private var keyboardInsets: InsetPadding? = null + private const val EXTRA_CHAT_ID = "chat_id" var isActive = false } @@ -124,9 +130,7 @@ class MainActivity: MotionLayoutNavigationActivity< askNotificationPermission() addWindowInsetChangeListener() - intent.extras?.getString("chat_id")?.toLongOrNull()?.let { chatId -> - handlePushNotification(chatId) - } + handlePushNotificationIntent(intent) } override fun onStart() { @@ -195,6 +199,8 @@ class MainActivity: MotionLayoutNavigationActivity< handleDeepLink(deepLink) } + handlePushNotificationIntent(intent) + setIntent(intent) } @@ -229,6 +235,30 @@ class MainActivity: MotionLayoutNavigationActivity< } } + private fun handlePushNotificationIntent(intent: Intent) { + if (!intent.hasExtra(EXTRA_CHAT_ID)) { + return + } + + sphinxNotificationManager.clearAllNotifications() + + val chatId = intent.getPushNotificationChatId() + intent.removeExtra(EXTRA_CHAT_ID) + + chatId?.let { handlePushNotification(it) } + } + + private fun Intent.getPushNotificationChatId(): Long? { + val extras = extras ?: return null + + return when (val chatId = extras.get(EXTRA_CHAT_ID)) { + is String -> chatId.toLongOrNull() + is Long -> chatId + is Int -> chatId.toLong() + else -> null + } + } + override suspend fun onViewStateFlowCollect(viewState: MainViewState) { when (viewState) { is MainViewState.DetailScreenActive -> { @@ -337,4 +367,3 @@ class MainActivity: MotionLayoutNavigationActivity< } } } - diff --git a/sphinx/application/data/concepts/concept-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManager.kt b/sphinx/application/data/concepts/concept-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManager.kt index eecb7dc51a..a5ce1b7735 100644 --- a/sphinx/application/data/concepts/concept-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManager.kt +++ b/sphinx/application/data/concepts/concept-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManager.kt @@ -24,4 +24,6 @@ interface SphinxNotificationManager { ) fun clearNotification(notificationId: Int) + + fun clearAllNotifications() } diff --git a/sphinx/application/data/features/feature-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManagerImpl.kt b/sphinx/application/data/features/feature-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManagerImpl.kt index cbae4d4389..e4d0fd9fce 100644 --- a/sphinx/application/data/features/feature-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManagerImpl.kt +++ b/sphinx/application/data/features/feature-sphinx-notification-manager/src/main/java/chat/sphinx/notification/SphinxNotificationManagerImpl.kt @@ -56,4 +56,8 @@ class SphinxNotificationManagerImpl( notificationManager.cancel(notificationId) } + override fun clearAllNotifications() { + notificationManager.cancelAll() + } + }