From 99c4af9b671d5ae01b615318aa1feba3cd908dba Mon Sep 17 00:00:00 2001 From: stylianosgakis Date: Thu, 26 Feb 2026 15:24:36 +0100 Subject: [PATCH 1/5] Move the claim chat deep link to the new chat --- .../com/hedvig/android/app/navigation/HedvigNavHost.kt | 1 + .../com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt | 7 ++++++- .../android/feature/odyssey/navigation/ClaimFlowGraph.kt | 1 - 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/navigation/HedvigNavHost.kt b/app/app/src/main/kotlin/com/hedvig/android/app/navigation/HedvigNavHost.kt index a8df2a6036..af67b02af5 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/navigation/HedvigNavHost.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/navigation/HedvigNavHost.kt @@ -478,6 +478,7 @@ private fun NavGraphBuilder.nestedHomeGraphs( ) { claimChatGraph( navController = navController, + hedvigDeepLinkContainer = hedvigDeepLinkContainer, shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale, openAppSettings = externalNavigator::openAppSettings, onNavigateToImageViewer = onNavigateToImageViewer, diff --git a/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt b/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt index 23ab035cec..38ce286a02 100644 --- a/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt +++ b/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt @@ -6,8 +6,10 @@ import androidx.navigation.NavGraphBuilder import coil3.ImageLoader import com.hedvig.android.navigation.common.Destination import com.hedvig.android.navigation.common.DestinationNavTypeAware +import com.hedvig.android.navigation.compose.navDeepLinks import com.hedvig.android.navigation.compose.navdestination import com.hedvig.android.navigation.compose.typedPopUpTo +import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.ui.force.upgrade.ForceUpgradeBlockingScreen import com.hedvig.feature.claim.chat.data.ClaimIntentOutcome import com.hedvig.feature.claim.chat.data.StepContent @@ -47,6 +49,7 @@ internal data object UpdateAppDestination : Destination fun NavGraphBuilder.claimChatGraph( navController: NavController, + hedvigDeepLinkContainer: HedvigDeepLinkContainer, shouldShowRequestPermissionRationale: (String) -> Boolean, openAppSettings: () -> Unit, onNavigateToImageViewer: (imageUrl: String, cacheKey: String) -> Unit, @@ -58,7 +61,9 @@ fun NavGraphBuilder.claimChatGraph( imageLoader: ImageLoader, onNavigateToNewConversation: () -> Unit, ) { - navdestination { + navdestination( + deepLinks = navDeepLinks(hedvigDeepLinkContainer.claimFlow), + ) { ClaimChatDestination( isDevelopmentFlow = isDevelopmentFlow, shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale, diff --git a/app/feature/feature-odyssey/src/main/kotlin/com/hedvig/android/feature/odyssey/navigation/ClaimFlowGraph.kt b/app/feature/feature-odyssey/src/main/kotlin/com/hedvig/android/feature/odyssey/navigation/ClaimFlowGraph.kt index d856d13ee5..ec3ae69c8f 100644 --- a/app/feature/feature-odyssey/src/main/kotlin/com/hedvig/android/feature/odyssey/navigation/ClaimFlowGraph.kt +++ b/app/feature/feature-odyssey/src/main/kotlin/com/hedvig/android/feature/odyssey/navigation/ClaimFlowGraph.kt @@ -78,7 +78,6 @@ fun NavGraphBuilder.claimFlowGraph( navdestination( enterTransition = { MotionDefaults.fadeThroughEnter }, exitTransition = { MotionDefaults.fadeThroughExit }, - deepLinks = navDeepLinks(hedvigDeepLinkContainer.claimFlow), ) { backStackEntry -> HonestyPledgeDestination( windowSizeClass = windowSizeClass, From 3fe244e343519732d932cf1c47a7771d96d14ef3 Mon Sep 17 00:00:00 2001 From: stylianosgakis Date: Fri, 27 Feb 2026 10:59:11 +0100 Subject: [PATCH 2/5] Fix crash for deep link not knowing how to populate default values --- .../kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt b/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt index 38ce286a02..2372e3f25b 100644 --- a/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt +++ b/app/feature/feature-claim-chat/src/androidMain/kotlin/com/hedvig/feature/claim/chat/ClaimChatNavGraph.kt @@ -22,8 +22,8 @@ import kotlinx.serialization.Serializable @Serializable data class ClaimChatDestination( - val isDevelopmentFlow: Boolean, - val messageId: String?, + val isDevelopmentFlow: Boolean = false, + val messageId: String? = null, ) : Destination @Serializable From f9d99250d76fcfcad2dbabaa92166c35a9611f2c Mon Sep 17 00:00:00 2001 From: stylianosgakis Date: Fri, 27 Feb 2026 11:48:27 +0100 Subject: [PATCH 3/5] Create a PermissionManager to query for system permissions in a KMP interface Create the ActivityCompatPermissionManager.kt as the implementation for Android and expose it in the android-only target through androidPermissionModule --- app/app/build.gradle.kts | 1 + .../hedvig/android/app/di/ApplicationModule.kt | 2 ++ .../feature-claim-chat/build.gradle.kts | 1 + .../permission-core/build.gradle.kts | 16 ++++++++++++++++ .../ActivityCompatPermissionManager.kt | 18 ++++++++++++++++++ .../permission/di/androidPermissionModule.kt | 10 ++++++++++ .../permission/NoopPermissionManager.kt | 5 +++++ .../hedvig/android/permission/Permission.kt | 5 +++++ .../android/permission/PermissionManager.kt | 5 +++++ .../permission/di/NoopPermissionModule.kt | 9 +++++++++ app/shareddi/build.gradle.kts | 1 + .../com/hedvig/android/shareddi/main.native.kt | 8 +++++++- 12 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 app/permission/permission-core/build.gradle.kts create mode 100644 app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/ActivityCompatPermissionManager.kt create mode 100644 app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/di/androidPermissionModule.kt create mode 100644 app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/NoopPermissionManager.kt create mode 100644 app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/Permission.kt create mode 100644 app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/PermissionManager.kt create mode 100644 app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/di/NoopPermissionModule.kt diff --git a/app/app/build.gradle.kts b/app/app/build.gradle.kts index 43c0bfad33..5ce43c61c6 100644 --- a/app/app/build.gradle.kts +++ b/app/app/build.gradle.kts @@ -217,6 +217,7 @@ dependencies { implementation(projects.languageMigration) implementation(projects.loggingDeviceModel) implementation(projects.loggingPublic) + implementation(projects.permissionCore) implementation(projects.memberRemindersPublic) implementation(projects.navigationActivity) implementation(projects.navigationCommon) diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt b/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt index 6a67023b7b..025d0bcc23 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt @@ -95,6 +95,7 @@ import com.hedvig.android.notification.badge.data.di.notificationBadgeModule import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.firebase.di.firebaseNotificationModule +import com.hedvig.android.permission.di.androidPermissionModule import com.hedvig.android.shared.foreverui.ui.di.foreverModule import com.hedvig.android.shared.tier.comparison.di.comparisonModule import com.hedvig.android.shareddi.sharedModule @@ -269,6 +270,7 @@ val applicationModule = module { listOf( addonPurchaseModule, addonRemovalModule, + androidPermissionModule, apolloAuthListenersModule, appModule, authModule, diff --git a/app/feature/feature-claim-chat/build.gradle.kts b/app/feature/feature-claim-chat/build.gradle.kts index a75dcfb69f..592cc504f2 100644 --- a/app/feature/feature-claim-chat/build.gradle.kts +++ b/app/feature/feature-claim-chat/build.gradle.kts @@ -45,6 +45,7 @@ kotlin { implementation(projects.designSystemHedvig) implementation(projects.languageCore) implementation(projects.moleculePublic) + implementation(projects.navigationCore) implementation(projects.networkClients) implementation(projects.uiClaimFlow) implementation(projects.uiForceUpgrade) diff --git a/app/permission/permission-core/build.gradle.kts b/app/permission/permission-core/build.gradle.kts new file mode 100644 index 0000000000..de45a5eba4 --- /dev/null +++ b/app/permission/permission-core/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("hedvig.multiplatform.library") + id("hedvig.multiplatform.library.android") + id("hedvig.gradle.plugin") +} + +kotlin { + sourceSets { + commonMain.dependencies { + implementation(libs.koin.core) + } + androidMain.dependencies { + implementation(libs.androidx.other.appCompat) + } + } +} diff --git a/app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/ActivityCompatPermissionManager.kt b/app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/ActivityCompatPermissionManager.kt new file mode 100644 index 0000000000..523392a773 --- /dev/null +++ b/app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/ActivityCompatPermissionManager.kt @@ -0,0 +1,18 @@ +package com.hedvig.android.permission + +import android.content.Context +import android.content.pm.PackageManager +import androidx.core.app.ActivityCompat + +internal class ActivityCompatPermissionManager( + private val context: Context, +) : PermissionManager { + override fun isPermissionGranted(permission: Permission): Boolean { + return ActivityCompat.checkSelfPermission(context, permission.toAndroidPermission()) == + PackageManager.PERMISSION_GRANTED + } + + private fun Permission.toAndroidPermission(): String = when (this) { + Permission.PostNotifications -> "android.permission.POST_NOTIFICATIONS" + } +} diff --git a/app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/di/androidPermissionModule.kt b/app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/di/androidPermissionModule.kt new file mode 100644 index 0000000000..0e6abf1f2c --- /dev/null +++ b/app/permission/permission-core/src/androidMain/kotlin/com/hedvig/android/permission/di/androidPermissionModule.kt @@ -0,0 +1,10 @@ +package com.hedvig.android.permission.di + +import android.content.Context +import com.hedvig.android.permission.ActivityCompatPermissionManager +import com.hedvig.android.permission.PermissionManager +import org.koin.dsl.module + +val androidPermissionModule = module { + single { ActivityCompatPermissionManager(get()) } +} diff --git a/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/NoopPermissionManager.kt b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/NoopPermissionManager.kt new file mode 100644 index 0000000000..e4b1c3ca8e --- /dev/null +++ b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/NoopPermissionManager.kt @@ -0,0 +1,5 @@ +package com.hedvig.android.permission + +internal class NoopPermissionManager : PermissionManager { + override fun isPermissionGranted(permission: Permission): Boolean = false +} diff --git a/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/Permission.kt b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/Permission.kt new file mode 100644 index 0000000000..25ce673d1e --- /dev/null +++ b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/Permission.kt @@ -0,0 +1,5 @@ +package com.hedvig.android.permission + +enum class Permission { + PostNotifications, +} diff --git a/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/PermissionManager.kt b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/PermissionManager.kt new file mode 100644 index 0000000000..fe33745bd2 --- /dev/null +++ b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/PermissionManager.kt @@ -0,0 +1,5 @@ +package com.hedvig.android.permission + +interface PermissionManager { + fun isPermissionGranted(permission: Permission): Boolean +} diff --git a/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/di/NoopPermissionModule.kt b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/di/NoopPermissionModule.kt new file mode 100644 index 0000000000..154ed54dfd --- /dev/null +++ b/app/permission/permission-core/src/commonMain/kotlin/com/hedvig/android/permission/di/NoopPermissionModule.kt @@ -0,0 +1,9 @@ +package com.hedvig.android.permission.di + +import com.hedvig.android.permission.NoopPermissionManager +import com.hedvig.android.permission.PermissionManager +import org.koin.dsl.module + +val noopPermissionModule = module { + single { NoopPermissionManager() } +} diff --git a/app/shareddi/build.gradle.kts b/app/shareddi/build.gradle.kts index ba54528fce..a34d17f156 100644 --- a/app/shareddi/build.gradle.kts +++ b/app/shareddi/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { implementation(projects.featureClaimChat) implementation(projects.languageCore) implementation(projects.networkClients) + implementation(projects.permissionCore) } } } diff --git a/app/shareddi/src/nativeMain/kotlin/com/hedvig/android/shareddi/main.native.kt b/app/shareddi/src/nativeMain/kotlin/com/hedvig/android/shareddi/main.native.kt index c49cf1f458..546fd8de09 100644 --- a/app/shareddi/src/nativeMain/kotlin/com/hedvig/android/shareddi/main.native.kt +++ b/app/shareddi/src/nativeMain/kotlin/com/hedvig/android/shareddi/main.native.kt @@ -3,6 +3,7 @@ package com.hedvig.android.shareddi import com.hedvig.android.core.buildconstants.AppBuildConfig import com.hedvig.android.core.datastore.DeviceIdFetcher import com.hedvig.android.network.clients.AccessTokenFetcher +import com.hedvig.android.permission.di.noopPermissionModule import com.hedvig.feature.claim.chat.di.claimChatModule import org.koin.core.context.startKoin @@ -13,6 +14,11 @@ fun initKoin( appBuildConfig: AppBuildConfig, ) { startKoin { - modules(iosPlatformModule(accessTokenFetcher, deviceIdFetcher), sharedModule(appBuildConfig), claimChatModule) + modules( + iosPlatformModule(accessTokenFetcher, deviceIdFetcher), + sharedModule(appBuildConfig), + claimChatModule, + noopPermissionModule, + ) } } From 6923d16588e83362cc38466f13150b3ee79942ea Mon Sep 17 00:00:00 2001 From: stylianosgakis Date: Fri, 27 Feb 2026 11:50:31 +0100 Subject: [PATCH 4/5] Pass information about notification permission to memberLogDevice --- app/logging/logging-device-model/build.gradle.kts | 1 + .../src/main/graphql/MutationMemberLogDevice.graphql | 4 ++-- .../logging/device/model/DeviceNameLoggingAuthListener.kt | 4 ++++ .../logging/device/model/di/LoggingDeviceModelModule.kt | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/logging/logging-device-model/build.gradle.kts b/app/logging/logging-device-model/build.gradle.kts index 368b4a9124..d005c5bee8 100644 --- a/app/logging/logging-device-model/build.gradle.kts +++ b/app/logging/logging-device-model/build.gradle.kts @@ -13,4 +13,5 @@ dependencies { implementation(projects.apolloCore) implementation(projects.apolloOctopusPublic) implementation(projects.authEventCore) + implementation(projects.permissionCore) } diff --git a/app/logging/logging-device-model/src/main/graphql/MutationMemberLogDevice.graphql b/app/logging/logging-device-model/src/main/graphql/MutationMemberLogDevice.graphql index aedcd6fda4..c8fe6798cd 100644 --- a/app/logging/logging-device-model/src/main/graphql/MutationMemberLogDevice.graphql +++ b/app/logging/logging-device-model/src/main/graphql/MutationMemberLogDevice.graphql @@ -1,5 +1,5 @@ -mutation MemberLogDevice($brand: String!, $model: String!) { - memberLogDevice(input: {os: "Android", brand: $brand, model: $model}) { +mutation MemberLogDevice($brand: String!, $model: String!, $pushNotificationEnabled: Boolean!) { + memberLogDevice(input: {os: "Android", brand: $brand, model: $model, pushNotificationEnabled: $pushNotificationEnabled}) { message } } diff --git a/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/DeviceNameLoggingAuthListener.kt b/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/DeviceNameLoggingAuthListener.kt index c004a35407..503f33aa92 100644 --- a/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/DeviceNameLoggingAuthListener.kt +++ b/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/DeviceNameLoggingAuthListener.kt @@ -5,10 +5,13 @@ import com.hedvig.android.apollo.safeExecute import com.hedvig.android.auth.event.AuthEventListener import com.hedvig.android.logger.LogPriority import com.hedvig.android.logger.logcat +import com.hedvig.android.permission.Permission +import com.hedvig.android.permission.PermissionManager import octopus.MemberLogDeviceMutation internal class DeviceNameLoggingAuthListener( private val apolloClient: ApolloClient, + private val permissionManager: PermissionManager, ) : AuthEventListener { override suspend fun loggedIn(accessToken: String) { val androidInfoProvider = AndroidInfoProvider() @@ -16,6 +19,7 @@ internal class DeviceNameLoggingAuthListener( MemberLogDeviceMutation( brand = androidInfoProvider.deviceBrand, model = androidInfoProvider.deviceName, + pushNotificationEnabled = permissionManager.isPermissionGranted(Permission.PostNotifications), ), ).safeExecute().fold( ifLeft = { diff --git a/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/di/LoggingDeviceModelModule.kt b/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/di/LoggingDeviceModelModule.kt index b9f10278c4..706255234e 100644 --- a/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/di/LoggingDeviceModelModule.kt +++ b/app/logging/logging-device-model/src/main/kotlin/com/hedvig/android/logging/device/model/di/LoggingDeviceModelModule.kt @@ -6,5 +6,5 @@ import org.koin.dsl.bind import org.koin.dsl.module val loggingDeviceModelModule = module { - single { DeviceNameLoggingAuthListener(get()) } bind AuthEventListener::class + single { DeviceNameLoggingAuthListener(get(), get()) } bind AuthEventListener::class } From cb25e3bacc9a03a457615f8db53175ed3fcb10f9 Mon Sep 17 00:00:00 2001 From: stylianosgakis Date: Fri, 27 Feb 2026 11:51:09 +0100 Subject: [PATCH 5/5] Use the new PermissionManager for `sendHedvigNotification` --- .../com/hedvig/android/app/di/ApplicationModule.kt | 11 +++++++++++ .../notification/senders/ChatNotificationSender.kt | 3 +++ .../senders/ClaimClosedNotificationSender.kt | 3 +++ .../app/notification/senders/ContactInfoSender.kt | 3 +++ .../senders/CrossSellNotificationSender.kt | 3 +++ .../notification/senders/GenericNotificationSender.kt | 3 +++ .../senders/InsuranceEvidenceNotificationSender.kt | 3 +++ .../senders/InsuranceTabNotificationSender.kt | 3 +++ .../notification/senders/PaymentNotificationSender.kt | 3 +++ .../senders/ReferralsNotificationSender.kt | 3 +++ .../app/notification/senders/TravelAddonSender.kt | 3 +++ app/notification/notification-core/build.gradle.kts | 1 + .../android/notification/core/NotificationExt.kt | 10 ++++------ 13 files changed, 46 insertions(+), 6 deletions(-) diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt b/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt index 025d0bcc23..4919f6e155 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/di/ApplicationModule.kt @@ -35,6 +35,7 @@ import com.hedvig.android.app.notification.senders.PaymentNotificationSender import com.hedvig.android.app.notification.senders.ReferralsNotificationSender import com.hedvig.android.app.notification.senders.TravelAddonSender import com.hedvig.android.auth.AuthTokenService +import com.hedvig.android.permission.PermissionManager import com.hedvig.android.auth.di.authModule import com.hedvig.android.core.appreview.di.coreAppReviewModule import com.hedvig.android.core.buildconstants.AppBuildConfig @@ -139,6 +140,7 @@ private val notificationModule = module { single { PaymentNotificationSender( get(), + get(), get(), get(), HedvigNotificationChannel.Payments, @@ -147,6 +149,7 @@ private val notificationModule = module { single { CrossSellNotificationSender( get(), + get(), get(), HedvigNotificationChannel.CrossSell, ) @@ -154,6 +157,7 @@ private val notificationModule = module { single { ReferralsNotificationSender( get(), + get(), get(), get(), HedvigNotificationChannel.Referrals, @@ -162,6 +166,7 @@ private val notificationModule = module { single { GenericNotificationSender( get(), + get(), get(), HedvigNotificationChannel.Other, ) @@ -169,6 +174,7 @@ private val notificationModule = module { single { ChatNotificationSender( get(), + get(), get(), get(), HedvigNotificationChannel.Chat, @@ -177,6 +183,7 @@ private val notificationModule = module { single { ClaimClosedNotificationSender( get(), + get(), get(), get(), HedvigNotificationChannel.Payments, @@ -185,6 +192,7 @@ private val notificationModule = module { single { ContactInfoSender( get(), + get(), get(), get(), HedvigNotificationChannel.Other, @@ -193,6 +201,7 @@ private val notificationModule = module { single { InsuranceTabNotificationSender( get(), + get(), get(), get(), HedvigNotificationChannel.Other, @@ -201,6 +210,7 @@ private val notificationModule = module { single { TravelAddonSender( get(), + get(), get(), get(), HedvigNotificationChannel.CrossSell, @@ -210,6 +220,7 @@ private val notificationModule = module { single { InsuranceEvidenceNotificationSender( get(), + get(), get(), get(), HedvigNotificationChannel.Other, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ChatNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ChatNotificationSender.kt index 2ad5b3e7d4..c8a5329241 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ChatNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ChatNotificationSender.kt @@ -31,6 +31,7 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R /** @@ -55,6 +56,7 @@ private val listOfDestinationsWhichShouldNotShowChatNotification = setOf( class ChatNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val hedvigDeepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -101,6 +103,7 @@ class ChatNotificationSender( .build() sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = CHAT_NOTIFICATION_ID, notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ClaimClosedNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ClaimClosedNotificationSender.kt index 42f40ed7d0..3b52e9aca4 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ClaimClosedNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ClaimClosedNotificationSender.kt @@ -17,10 +17,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class ClaimClosedNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val hedvigDeepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -55,6 +57,7 @@ class ClaimClosedNotificationSender( .build() sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = CLAIM_CLOSED_NOTIFICATION_ID, notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ContactInfoSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ContactInfoSender.kt index 200e0a45a1..9fe02732da 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ContactInfoSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ContactInfoSender.kt @@ -12,10 +12,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class ContactInfoSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val deepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -42,6 +44,7 @@ class ContactInfoSender( sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = ContactInfoNotificationId, notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/CrossSellNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/CrossSellNotificationSender.kt index cf9b3c48e0..68d43100a4 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/CrossSellNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/CrossSellNotificationSender.kt @@ -14,10 +14,12 @@ import com.hedvig.android.logger.logcat import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class CrossSellNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val notificationChannel: HedvigNotificationChannel, ) : NotificationSender { @@ -52,6 +54,7 @@ class CrossSellNotificationSender( .build() sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = CROSS_SELL_NOTIFICATION_ID, notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/GenericNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/GenericNotificationSender.kt index e486d9e5b6..23969c365d 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/GenericNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/GenericNotificationSender.kt @@ -12,11 +12,13 @@ import com.hedvig.android.core.buildconstants.HedvigBuildConstants import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R import java.util.concurrent.atomic.AtomicInteger class GenericNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val notificationChannel: HedvigNotificationChannel, ) : NotificationSender { @@ -47,6 +49,7 @@ class GenericNotificationSender( sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = id.getAndIncrement(), notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceEvidenceNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceEvidenceNotificationSender.kt index 567779a8aa..6a3c1c5dd6 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceEvidenceNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceEvidenceNotificationSender.kt @@ -15,10 +15,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class InsuranceEvidenceNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val hedvigDeepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -46,6 +48,7 @@ class InsuranceEvidenceNotificationSender( .build() sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = INSURANCE_EVIDENCE_NOTIFICATION_ID, notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceTabNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceTabNotificationSender.kt index 01e6747de2..abe2654894 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceTabNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/InsuranceTabNotificationSender.kt @@ -14,10 +14,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R internal class InsuranceTabNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val deepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -53,6 +55,7 @@ internal class InsuranceTabNotificationSender( sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = NotificationId, notification = builder.build(), notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/PaymentNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/PaymentNotificationSender.kt index bb1517f9fd..4005f7cf6b 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/PaymentNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/PaymentNotificationSender.kt @@ -12,10 +12,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class PaymentNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val deepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -68,6 +70,7 @@ class PaymentNotificationSender( sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = notificationId, notification = notification, notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ReferralsNotificationSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ReferralsNotificationSender.kt index 31bb65f3b1..0c2172c9ec 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ReferralsNotificationSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/ReferralsNotificationSender.kt @@ -13,10 +13,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class ReferralsNotificationSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val deepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -46,6 +48,7 @@ class ReferralsNotificationSender( .setContentIntent(pendingIntent) sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = REFERRAL_NOTIFICATION_ID, notification = notificationBuilder.build(), notificationChannel = notificationChannel, diff --git a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/TravelAddonSender.kt b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/TravelAddonSender.kt index 039417b2a9..e0cfd9a911 100644 --- a/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/TravelAddonSender.kt +++ b/app/app/src/main/kotlin/com/hedvig/android/app/notification/senders/TravelAddonSender.kt @@ -12,10 +12,12 @@ import com.hedvig.android.navigation.core.HedvigDeepLinkContainer import com.hedvig.android.notification.core.HedvigNotificationChannel import com.hedvig.android.notification.core.NotificationSender import com.hedvig.android.notification.core.sendHedvigNotification +import com.hedvig.android.permission.PermissionManager import hedvig.resources.R class TravelAddonSender( private val context: Context, + private val permissionManager: PermissionManager, private val buildConstants: HedvigBuildConstants, private val deepLinkContainer: HedvigDeepLinkContainer, private val notificationChannel: HedvigNotificationChannel, @@ -42,6 +44,7 @@ class TravelAddonSender( sendHedvigNotification( context = context, + permissionManager = permissionManager, notificationId = NotificationId, notification = notification, notificationChannel = notificationChannel, diff --git a/app/notification/notification-core/build.gradle.kts b/app/notification/notification-core/build.gradle.kts index 8d6caaac39..f69a087955 100644 --- a/app/notification/notification-core/build.gradle.kts +++ b/app/notification/notification-core/build.gradle.kts @@ -9,4 +9,5 @@ dependencies { implementation(libs.androidx.other.coreKtx) implementation(libs.firebase.messaging) implementation(projects.coreResources) + implementation(projects.permissionCore) } diff --git a/app/notification/notification-core/src/main/kotlin/com/hedvig/android/notification/core/NotificationExt.kt b/app/notification/notification-core/src/main/kotlin/com/hedvig/android/notification/core/NotificationExt.kt index ba77a40182..778e0a5344 100644 --- a/app/notification/notification-core/src/main/kotlin/com/hedvig/android/notification/core/NotificationExt.kt +++ b/app/notification/notification-core/src/main/kotlin/com/hedvig/android/notification/core/NotificationExt.kt @@ -8,22 +8,20 @@ import android.content.pm.PackageManager import androidx.core.app.ActivityCompat import androidx.core.app.NotificationManagerCompat import com.hedvig.android.logger.logcat +import com.hedvig.android.permission.Permission +import com.hedvig.android.permission.PermissionManager @SuppressLint("MissingPermission") fun sendHedvigNotification( context: Context, + permissionManager: PermissionManager, notificationId: Int, notification: Notification, notificationChannel: HedvigNotificationChannel, notificationSenderName: String?, ) { logcat { "$notificationSenderName is going to send a notification" } - if ( - ActivityCompat.checkSelfPermission( - context, - Manifest.permission.POST_NOTIFICATIONS, - ) == PackageManager.PERMISSION_GRANTED - ) { + if (permissionManager.isPermissionGranted(Permission.PostNotifications)) { notificationChannel.createChannel(context) NotificationManagerCompat .from(context)