From 3985c8e5da4f3dffc3e2c80fc32473e14230889e Mon Sep 17 00:00:00 2001 From: Aparna Vadlamani Date: Wed, 20 Nov 2024 20:55:19 +0530 Subject: [PATCH] NTP-11931 | Notify Me: NotificationSettings (#13710) --- .../analytics/AppSettingsAnalytics.kt | 32 +++- .../notificationSettings/BottomSheetState.kt | 27 +++ .../NotificationSettingsUiEvents.kt | 8 +- .../NotificationSettingsUiState.kt | 11 +- .../reducer/NotificationSettingsReducer.kt | 28 +-- .../NotificationSettingsRepository.kt | 27 ++- .../bottomSheets/ErrorBottomSheetContent.kt | 91 ++++++++++ .../NotificationSettingBottomSheet.kt | 61 +++++++ .../NotificationSettingsBottomSheetContent.kt | 110 ++++++++++++ .../ui/common/SwitchableSettingsContainer.kt | 9 +- .../ui/screens/NotificationSettingsScreen.kt | 161 ++++++++++++++---- .../ui/screens/PermissionSettingsScreen.kt | 3 + .../NotificationScreenConstants.kt} | 10 +- .../utils/NotificationSettingsUtils.kt | 116 +++++++++++++ .../utils/PermissionSettingsUtils.kt | 9 - .../viewmodel/NotificationSettingsVM.kt | 43 +++-- ...onse.kt => NotificationSettingsContent.kt} | 10 +- .../network/retrofit/RetrofitService.kt | 11 +- android/app/src/main/res/values/strings.xml | 9 +- .../naviwidgets/utils/NaviWidgetIconUtils.kt | 8 +- .../drawable/ic_black_bell_notification.xml | 23 +++ .../src/main/res/drawable/ic_purple_retry.xml | 34 ++++ ...tsapp.xml => ic_whatsapp_notification.xml} | 0 .../res/drawable/navi_widgets_ic_refresh.xml | 61 ------- 24 files changed, 741 insertions(+), 161 deletions(-) create mode 100644 android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/BottomSheetState.kt create mode 100644 android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/ErrorBottomSheetContent.kt create mode 100644 android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingBottomSheet.kt create mode 100644 android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingsBottomSheetContent.kt rename android/app/src/main/java/com/naviapp/appsettings/{model/AppSettingsScreenType.kt => utils/NotificationScreenConstants.kt} (51%) create mode 100644 android/app/src/main/java/com/naviapp/appsettings/utils/NotificationSettingsUtils.kt rename android/app/src/main/java/com/naviapp/models/response/{NotificationSettingsResponse.kt => NotificationSettingsContent.kt} (55%) create mode 100644 android/navi-widgets/src/main/res/drawable/ic_black_bell_notification.xml create mode 100644 android/navi-widgets/src/main/res/drawable/ic_purple_retry.xml rename android/navi-widgets/src/main/res/drawable/{ic_whatsapp.xml => ic_whatsapp_notification.xml} (100%) delete mode 100644 android/navi-widgets/src/main/res/drawable/navi_widgets_ic_refresh.xml diff --git a/android/app/src/main/java/com/naviapp/appsettings/analytics/AppSettingsAnalytics.kt b/android/app/src/main/java/com/naviapp/appsettings/analytics/AppSettingsAnalytics.kt index 5a83ed274b..4ea2b9ba49 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/analytics/AppSettingsAnalytics.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/analytics/AppSettingsAnalytics.kt @@ -79,10 +79,36 @@ class AppSettingsAnalytics { NaviTrackEvent.trackEvent(eventName = analyticsPrefix + "notification_screen_land") } - fun onCheckNotificationSettingsConsent(isChecked: Boolean) = + fun onEnableAllNotifications() { + NaviTrackEvent.trackEvent(eventName = analyticsPrefix + "enable_all_notifications") + } + + fun onCheckNotificationSettingsConsent(medium: String, isChecked: Boolean) = NaviTrackEvent.trackEvent( - if (isChecked) analyticsPrefix + "whatsapp_notification_settings_toggle_yes" - else analyticsPrefix + "whatsapp_notification_settings_toggle_no" + eventName = + if (isChecked) analyticsPrefix + "notification_settings_toggle_yes" + else analyticsPrefix + "notification_settings_toggle_no", + eventValues = mapOf(Pair("medium", medium)) + ) + + fun onNotificationSettingsBottomSheetLand() = + NaviTrackEvent.trackEvent( + eventName = analyticsPrefix + "notification_settings_bottom_sheet_land" + ) + + fun onNotificationSettingsBottomSheetCTAClicked() = + NaviTrackEvent.trackEvent( + eventName = analyticsPrefix + "notification_settings_bottom_sheet_cta_clicked" + ) + + fun onNotificationSettingsBottomSheetDismissed() = + NaviTrackEvent.trackEvent( + eventName = analyticsPrefix + "notification_settings_bottom_sheet_cta_clicked" + ) + + fun onErrorBottomSheetLand() = + NaviTrackEvent.trackEvent( + eventName = analyticsPrefix + "notification_settings_error_bottom_sheet_land" ) } diff --git a/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/BottomSheetState.kt b/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/BottomSheetState.kt new file mode 100644 index 0000000000..5c527ffe62 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/BottomSheetState.kt @@ -0,0 +1,27 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.appsettings.model.notificationSettings + +import androidx.compose.runtime.Stable + +@Stable +data class NotificationSettingsBottomSheetState( + val isVisible: Boolean = false, + val content: BottomSheetContent? = null, +) + +@Stable +data class BottomSheetContent( + val composableType: NotificationSettingsBottomSheetType? = null, + val data: Any? = null +) + +enum class NotificationSettingsBottomSheetType { + OPEN_SETTINGS, + ERROR +} diff --git a/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiEvents.kt b/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiEvents.kt index 5e828cdff1..ba545fcc51 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiEvents.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiEvents.kt @@ -16,6 +16,12 @@ sealed interface NotificationSettingsUiEvents : UiEvent { data class UpdateNotificationSettingsState(val state: SettingsState) : NotificationSettingsUiEvents - data class UpdateNotificationSettings(val notificationSettings: NotificationSettings) : + data class UpdateNotificationSettings( + val notificationSettingsList: List + ) : NotificationSettingsUiEvents + + data class ShowBottomSheet(val bottomSheetContent: BottomSheetContent) : NotificationSettingsUiEvents + + data object HideBottomSheet : NotificationSettingsUiEvents } diff --git a/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiState.kt b/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiState.kt index ce7c374825..0ef9b86c7a 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiState.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/model/notificationSettings/NotificationSettingsUiState.kt @@ -11,8 +11,15 @@ import androidx.compose.runtime.Immutable import com.navi.common.basemvi.UiState @Immutable -data class NotificationSettingsUiState(val settingsState: SettingsState) : UiState { +data class NotificationSettingsUiState( + val settingsState: SettingsState, + val bottomSheetState: NotificationSettingsBottomSheetState +) : UiState { companion object { - fun initial() = NotificationSettingsUiState(settingsState = SettingsState.Loading) + fun initial() = + NotificationSettingsUiState( + settingsState = SettingsState.Loading, + bottomSheetState = NotificationSettingsBottomSheetState() + ) } } diff --git a/android/app/src/main/java/com/naviapp/appsettings/reducer/NotificationSettingsReducer.kt b/android/app/src/main/java/com/naviapp/appsettings/reducer/NotificationSettingsReducer.kt index 0558461324..1b295fb377 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/reducer/NotificationSettingsReducer.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/reducer/NotificationSettingsReducer.kt @@ -8,6 +8,7 @@ package com.naviapp.appsettings.reducer import com.navi.common.basemvi.BaseReducer +import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsBottomSheetState import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsUiEvents import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsUiState import com.naviapp.appsettings.model.notificationSettings.SettingsState @@ -24,21 +25,28 @@ class NotificationSettingsReducer : } is NotificationSettingsUiEvents.UpdateNotificationSettings -> { if (previousState.settingsState is SettingsState.Success) { - val updatedList = - previousState.settingsState.notificationSettingsList.map { - notificationSetting -> - if (notificationSetting.medium == event.notificationSettings.medium) { - event.notificationSettings - } else { - notificationSetting - } - } previousState.copy( settingsState = - previousState.settingsState.copy(notificationSettingsList = updatedList) + previousState.settingsState.copy( + notificationSettingsList = event.notificationSettingsList + ) ) } else previousState } + is NotificationSettingsUiEvents.ShowBottomSheet -> { + previousState.copy( + bottomSheetState = + NotificationSettingsBottomSheetState( + isVisible = true, + content = event.bottomSheetContent + ) + ) + } + NotificationSettingsUiEvents.HideBottomSheet -> { + previousState.copy( + bottomSheetState = previousState.bottomSheetState.copy(isVisible = false) + ) + } } } } diff --git a/android/app/src/main/java/com/naviapp/appsettings/repository/NotificationSettingsRepository.kt b/android/app/src/main/java/com/naviapp/appsettings/repository/NotificationSettingsRepository.kt index 86143162c9..21a8c9831f 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/repository/NotificationSettingsRepository.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/repository/NotificationSettingsRepository.kt @@ -12,13 +12,21 @@ import com.navi.common.checkmate.model.MetricInfo import com.naviapp.models.response.NotificationSettings import com.naviapp.models.response.NotificationSettingsContent import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.utils.superAppRetrofitService +import com.naviapp.network.retrofit.RetrofitService import javax.inject.Inject -class NotificationSettingsRepository @Inject constructor() : ResponseCallback() { - suspend fun fetchNotificationData(naeScreenName: String) = +class NotificationSettingsRepository @Inject constructor(val retrofitService: RetrofitService) : + ResponseCallback() { + suspend fun fetchNotificationData( + naeScreenName: String, + type: String, + notificationPermission: Boolean + ) = apiResponseCallback( - superAppRetrofitService().fetchNotificationData(), + retrofitService.fetchNotificationData( + type = type, + notificationPermission = notificationPermission + ), metricInfo = MetricInfo.AppMetric( screen = naeScreenName, @@ -27,14 +35,15 @@ class NotificationSettingsRepository @Inject constructor() : ResponseCallback() ) suspend fun updateCommunicationMediums( - notificationSettings: NotificationSettings, + type: String, + notificationSettings: List, screenName: String ) = apiResponseCallback( - superAppRetrofitService() - .updateCommunicationMediums( - NotificationSettingsContent(listOf(notificationSettings)) - ), + retrofitService.updateCommunicationMediums( + type = type, + notificationContent = NotificationSettingsContent(notificationSettings) + ), metricInfo = MetricInfo.AppMetric(screen = screenName, isNae = { false }) ) } diff --git a/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/ErrorBottomSheetContent.kt b/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/ErrorBottomSheetContent.kt new file mode 100644 index 0000000000..43d35aa2e5 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/ErrorBottomSheetContent.kt @@ -0,0 +1,91 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.appsettings.ui.bottomSheets + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.navi.common.R +import com.navi.common.network.models.GenericErrorResponse +import com.navi.elex.atoms.ElexImage +import com.navi.elex.atoms.ElexText +import com.navi.elex.molecules.ElexButtonWithText +import com.navi.elex.utils.FontFamilyEnum +import com.navi.elex.utils.FontWeightEnum + +@Composable +fun ErrorBottomSheetContent(errorMessage: GenericErrorResponse? = null, onDismiss: () -> Unit) { + Column( + modifier = + Modifier.fillMaxWidth() + .wrapContentHeight() + .padding(16.dp, 16.dp, 16.dp, 32.dp) + .background(Color.White), + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start + ) { + ElexImage(iconCode = R.drawable.ic_exclamation_red_border, modifier = Modifier.size(24.dp)) + Spacer(Modifier.height(8.dp)) + ElexText( + text = + errorMessage?.title + ?: stringResource( + com.naviapp.R.string.something_went_wrong_without_exclamation + ), + color = Color(0xFF191919), + fontSize = 16.sp, + fontWeight = FontWeightEnum.TT_SEMI_BOLD, + fontFamily = FontFamilyEnum.TT, + lineHeight = 24.sp + ) + Spacer(Modifier.height(8.dp)) + ElexText( + text = + errorMessage?.message + ?: stringResource(com.naviapp.R.string.please_try_again_later), + color = Color(0xFF6B6B6B), + fontSize = 14.sp, + fontWeight = FontWeightEnum.TT_REGULAR, + fontFamily = FontFamilyEnum.TT, + lineHeight = 22.sp + ) + Spacer(Modifier.height(32.dp)) + ElexButtonWithText( + text = stringResource(com.naviapp.R.string.okay_got_it_with_comma), + onClick = onDismiss, + modifier = Modifier.fillMaxWidth(), + contentPadding = PaddingValues(16.dp), + textColor = Color.White, + fontSize = 14.sp, + fontWeight = FontWeightEnum.TT_SEMI_BOLD, + shape = RoundedCornerShape(4.dp), + colors = + ButtonDefaults.buttonColors( + contentColor = Color(0xFF1F002A), + containerColor = Color(0xFF1F002A), + ), + border = null, + ) + } +} diff --git a/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingBottomSheet.kt b/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingBottomSheet.kt new file mode 100644 index 0000000000..b9965e0aae --- /dev/null +++ b/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingBottomSheet.kt @@ -0,0 +1,61 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.appsettings.ui.bottomSheets + +import androidx.compose.runtime.Composable +import com.navi.base.utils.orFalse +import com.navi.common.network.models.GenericErrorResponse +import com.navi.elex.atoms.ElexBottomSheet +import com.naviapp.appsettings.analytics.AppSettingsAnalytics +import com.naviapp.appsettings.model.notificationSettings.BottomSheetContent +import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsBottomSheetState +import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsBottomSheetType + +@Composable +fun NotificationSettingsBottomSheet( + state: NotificationSettingsBottomSheetState, + onDismiss: () -> Unit, + openSettings: () -> Unit +) { + ElexBottomSheet(visible = state.isVisible.orFalse(), onDismissRequest = onDismiss) { + BottomSheetContentRenderer(state.content, openSettings, onDismiss) + } +} + +@Composable +private fun BottomSheetContentRenderer( + content: BottomSheetContent?, + openSettings: () -> Unit, + onDismiss: () -> Unit, + analytics: AppSettingsAnalytics.NotificationSettings = + AppSettingsAnalytics().NotificationSettings() +) { + when (content?.composableType) { + NotificationSettingsBottomSheetType.OPEN_SETTINGS -> { + analytics.onNotificationSettingsBottomSheetLand() + NotificationSettingBottomSheetContent( + onDismiss = { + analytics.onNotificationSettingsBottomSheetDismissed() + onDismiss.invoke() + }, + onClick = { + analytics.onNotificationSettingsBottomSheetCTAClicked() + openSettings() + } + ) + } + NotificationSettingsBottomSheetType.ERROR -> { + analytics.onErrorBottomSheetLand() + ErrorBottomSheetContent( + errorMessage = content.data as? GenericErrorResponse, + onDismiss = { onDismiss.invoke() } + ) + } + else -> Unit + } +} diff --git a/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingsBottomSheetContent.kt b/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingsBottomSheetContent.kt new file mode 100644 index 0000000000..267bdf528a --- /dev/null +++ b/android/app/src/main/java/com/naviapp/appsettings/ui/bottomSheets/NotificationSettingsBottomSheetContent.kt @@ -0,0 +1,110 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.appsettings.ui.bottomSheets + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.navi.elex.atoms.ElexText +import com.navi.elex.molecules.ElexButtonWithText +import com.navi.elex.utils.FontFamilyEnum +import com.navi.elex.utils.FontWeightEnum +import com.naviapp.R + +@Composable +fun NotificationSettingBottomSheetContent(onDismiss: () -> Unit, onClick: () -> Unit) { + Column( + modifier = + Modifier.fillMaxWidth() + .wrapContentHeight() + .padding(16.dp, 16.dp, 16.dp, 32.dp) + .background(Color.White), + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start + ) { + ElexText( + text = stringResource(R.string.allow_notifications), + color = Color(0xFF191919), + fontSize = 18.sp, + fontWeight = FontWeightEnum.TT_MEDIUM, + fontFamily = FontFamilyEnum.TT, + lineHeight = 24.sp + ) + Row( + modifier = + Modifier.fillMaxWidth().wrapContentHeight().padding(0.dp, 24.dp, 0.dp, 32.dp), + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.Top + ) { + Row( + modifier = Modifier.size(40.dp).background(Color(0xFFF5F5F5), shape = CircleShape), + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically + ) {} + + Column( + modifier = Modifier.wrapContentSize().padding(8.dp, 0.dp, 0.dp, 0.dp), + verticalArrangement = Arrangement.Top + ) { + ElexText( + text = stringResource(R.string.app_notifications), + color = Color(0xFF191919), + fontSize = 16.sp, + fontWeight = FontWeightEnum.TT_MEDIUM, + fontFamily = FontFamilyEnum.TT, + lineHeight = 24.sp + ) + ElexText( + text = stringResource(R.string.to_enable_notifications), + color = Color(0xFF6B6B6B), + fontSize = 12.sp, + fontWeight = FontWeightEnum.TT_REGULAR, + fontFamily = FontFamilyEnum.TT, + lineHeight = 18.sp + ) + } + } + + ElexButtonWithText( + text = stringResource(R.string.go_to_settings_text), + onClick = { + onDismiss() + onClick() + }, + modifier = Modifier.fillMaxWidth(), + contentPadding = PaddingValues(vertical = 17.dp), + textColor = Color.White, + fontSize = 14.sp, + fontWeight = FontWeightEnum.TT_SEMI_BOLD, + shape = RoundedCornerShape(4.dp), + colors = + ButtonDefaults.buttonColors( + contentColor = Color(0xFF1F002A), + containerColor = Color(0xFF1F002A), + ), + border = null, + ) + } +} diff --git a/android/app/src/main/java/com/naviapp/appsettings/ui/common/SwitchableSettingsContainer.kt b/android/app/src/main/java/com/naviapp/appsettings/ui/common/SwitchableSettingsContainer.kt index c069cdb590..c2890f9785 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/ui/common/SwitchableSettingsContainer.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/ui/common/SwitchableSettingsContainer.kt @@ -36,7 +36,8 @@ fun SwitchableSettingsContainer(content: @Composable () -> Unit) { Column( Modifier.fillMaxWidth() .border(width = 1.dp, color = Color(0xffEBEBEB), shape = RoundedCornerShape(4.dp)) - .background(color = Color.White, shape = RoundedCornerShape(4.dp)), + .background(color = Color.White, shape = RoundedCornerShape(4.dp)) + .padding(horizontal = 16.dp, vertical = 8.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.Start ) { @@ -54,7 +55,7 @@ fun SwitchableSetting( onCheckedChange: (Boolean) -> Unit ) { Row( - modifier = Modifier.fillMaxWidth().padding(16.dp), + modifier = Modifier.fillMaxWidth().padding(vertical = 9.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -64,8 +65,8 @@ fun SwitchableSetting( modifier = Modifier.size(32.dp).align(Alignment.Top) ) Column( - modifier = Modifier.weight(1f).padding(horizontal = 16.dp), - verticalArrangement = Arrangement.spacedBy(2.dp) + modifier = Modifier.weight(1f).padding(start = 12.dp, end = 8.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) ) { ElexText( text = title, diff --git a/android/app/src/main/java/com/naviapp/appsettings/ui/screens/NotificationSettingsScreen.kt b/android/app/src/main/java/com/naviapp/appsettings/ui/screens/NotificationSettingsScreen.kt index 412b282190..2bcd13021b 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/ui/screens/NotificationSettingsScreen.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/ui/screens/NotificationSettingsScreen.kt @@ -7,6 +7,8 @@ package com.naviapp.appsettings.ui.screens +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -34,27 +36,37 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.navi.alfred.utils.orFalse +import com.navi.base.utils.orFalse import com.navi.elex.atoms.ElexImage import com.navi.elex.atoms.ElexText import com.navi.elex.utils.FontWeightEnum -import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_RETRY +import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_PURPLE_RETRY import com.navi.naviwidgets.utils.NaviWidgetIconUtils.getImageFromIconCode import com.naviapp.R +import com.naviapp.appsettings.activity.AppSettingsActivity import com.naviapp.appsettings.analytics.AppSettingsAnalytics -import com.naviapp.appsettings.model.AppSettingsScreenType import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsUiEvents import com.naviapp.appsettings.model.notificationSettings.SettingsState +import com.naviapp.appsettings.ui.bottomSheets.NotificationSettingsBottomSheet import com.naviapp.appsettings.ui.common.ScreenInformationText +import com.naviapp.appsettings.ui.common.ScreenSectionHeading import com.naviapp.appsettings.ui.common.ScreenTitle import com.naviapp.appsettings.ui.common.ScreenTopBar import com.naviapp.appsettings.ui.common.SwitchableSetting import com.naviapp.appsettings.ui.common.SwitchableSettingsContainer +import com.naviapp.appsettings.utils.AppSettingsScreenType +import com.naviapp.appsettings.utils.MEDIUM +import com.naviapp.appsettings.utils.SettingsMedium +import com.naviapp.appsettings.utils.enableAllNotifications import com.naviapp.appsettings.utils.getIconCodeFromMedium +import com.naviapp.appsettings.utils.handleNotificationSettingChange +import com.naviapp.appsettings.utils.hasNotificationPermission +import com.naviapp.appsettings.utils.onNotificationToggleChange import com.naviapp.appsettings.viewmodel.NotificationSettingsVM import com.naviapp.home.utils.shimmerEffect import com.naviapp.models.response.NotificationSettings @@ -64,18 +76,39 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator @Destination @Composable fun NotificationSettingsScreen( + activity: AppSettingsActivity, viewModel: NotificationSettingsVM = hiltViewModel(), destinationsNavigator: DestinationsNavigator, analytics: AppSettingsAnalytics.NotificationSettings = AppSettingsAnalytics().NotificationSettings() ) { val state by viewModel.state.collectAsStateWithLifecycle() + val permissionLauncher = + rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission(), + onResult = { enabled -> + handleNotificationSettingChange( + viewModel, + listOf(NotificationSettings(SettingsMedium.PUSH_NOTIFICATION, enabled)) + ) + } + ) + LaunchedEffect(Unit) { analytics.onNotificationScreenLanded() viewModel.fetchNotificationData( - naeScreenName = AppSettingsScreenType.NotificationSettingsScreen.name + naeScreenName = AppSettingsScreenType.NotificationSettingsScreen.name, + type = MEDIUM, + notificationPermission = hasNotificationPermission(activity) ) } + + NotificationSettingsBottomSheet( + state = state.bottomSheetState, + onDismiss = { viewModel.sendEvent(NotificationSettingsUiEvents.HideBottomSheet) }, + openSettings = { activity.openAppSettings() } + ) + Scaffold( topBar = { ScreenTopBar( @@ -97,9 +130,9 @@ fun NotificationSettingsScreen( Spacer(Modifier.height(24.dp)) ScreenInformationText(stringResource(R.string.notification_settings_description_text)) Spacer(Modifier.height(32.dp)) - SwitchableSettingsContainer { - when (val settingsState = state.settingsState) { - is SettingsState.Error -> + when (val settingsState = state.settingsState) { + is SettingsState.Error -> + SwitchableSettingsContainer { ErrorStateComponent( onRetry = { viewModel.sendEvent( @@ -109,30 +142,91 @@ fun NotificationSettingsScreen( ) viewModel.fetchNotificationData( naeScreenName = - AppSettingsScreenType.NotificationSettingsScreen.name + AppSettingsScreenType.NotificationSettingsScreen.name, + type = MEDIUM, + notificationPermission = hasNotificationPermission(activity) ) } ) - is SettingsState.Success -> { - settingsState.notificationSettingsList.forEach { setting -> - key(setting.medium) { - SwitchableSettingItem( - setting = setting, - onCheckedChange = { enabled -> - analytics.onCheckNotificationSettingsConsent(enabled) - viewModel.updateCommunicationMediums( - notificationSettings = setting.copy(enabled = enabled), - naeScreenName = - AppSettingsScreenType.NotificationSettingsScreen - .name - ) - } - ) - } - } } - SettingsState.Loading -> LoadingStateComponent() + is SettingsState.Success -> { + NotificationSettingsContainer( + settingsState = settingsState, + enableAllNotifications = { + enableAllNotifications( + settingsState, + activity, + viewModel, + permissionLauncher + ) + }, + onCheckedChange = { setting, enabled -> + onNotificationToggleChange( + setting, + enabled, + activity, + permissionLauncher, + viewModel + ) + }, + ) } + SettingsState.Loading -> LoadingStateComponent() + } + } + } +} + +@Composable +private fun NotificationSettingsContainer( + settingsState: SettingsState.Success, + enableAllNotifications: () -> Unit, + onCheckedChange: (NotificationSettings, Boolean) -> Unit, + analytics: AppSettingsAnalytics.NotificationSettings = + AppSettingsAnalytics().NotificationSettings() +) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + ScreenSectionHeading(stringResource(R.string.permission_settings_screen_section_heading)) + if (settingsState.notificationSettingsList.any { it.enabled == false }) { + ElexText( + text = stringResource(R.string.enable_all_permissions_text), + color = Color(0xff191919), + fontSize = 14.sp, + lineHeight = 22.sp, + fontWeight = FontWeightEnum.TT_MEDIUM, + textDecoration = TextDecoration.Underline, + modifier = + Modifier.clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(bounded = true) + ) { + analytics.onEnableAllNotifications() + enableAllNotifications() + } + ) + } + } + Spacer(Modifier.height(8.dp)) + SwitchableSettingsContainer { + settingsState.notificationSettingsList.forEach { setting -> + key(setting.medium) { + SwitchableSettingItem( + setting = setting, + onCheckedChange = { enabled -> + analytics.onCheckNotificationSettingsConsent( + setting.medium?.name.orEmpty(), + enabled + ) + onCheckedChange(setting, enabled) + } + ) + } + if (setting != settingsState.notificationSettingsList.last()) { + Spacer(Modifier.height(8.dp)) } } } @@ -141,12 +235,12 @@ fun NotificationSettingsScreen( @Composable private fun ErrorStateComponent(onRetry: () -> Unit) { Row( - Modifier.fillMaxWidth().padding(16.dp), + Modifier.fillMaxWidth().padding(vertical = 9.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { ElexText( - "Unable to load", + stringResource(R.string.unable_to_load), fontWeight = FontWeightEnum.TT_MEDIUM, color = Color(0xff6B6B6B), fontSize = 16.sp, @@ -162,7 +256,7 @@ private fun ErrorStateComponent(onRetry: () -> Unit) { verticalAlignment = Alignment.CenterVertically, ) { ElexText( - "Retry", + stringResource(R.string.retry), fontWeight = FontWeightEnum.TT_SEMI_BOLD, color = Color(0xFF191919), fontSize = 14.sp, @@ -170,7 +264,7 @@ private fun ErrorStateComponent(onRetry: () -> Unit) { ) Spacer(Modifier.width(4.dp)) ElexImage( - iconCode = getImageFromIconCode(ICON_RETRY), + iconCode = getImageFromIconCode(ICON_PURPLE_RETRY), contentDescription = "Settings", modifier = Modifier.size(20.dp) ) @@ -182,7 +276,7 @@ private fun ErrorStateComponent(onRetry: () -> Unit) { private fun LoadingStateComponent() { Box( Modifier.fillMaxWidth() - .height(56.dp) + .height(214.dp) .clip(shape = RoundedCornerShape(4.dp)) .background(Color.White, shape = RoundedCornerShape(4.dp)) .shimmerEffect() @@ -195,9 +289,8 @@ private fun SwitchableSettingItem( onCheckedChange: (Boolean) -> Unit ) { SwitchableSetting( - title = setting.title.orEmpty(), - iconCode = getIconCodeFromMedium(medium = setting.medium.orEmpty()), - description = setting.description, + title = setting.medium?.title.orEmpty(), + iconCode = getIconCodeFromMedium(medium = setting.medium), isGranted = setting.enabled.orFalse(), onCheckedChange = onCheckedChange ) diff --git a/android/app/src/main/java/com/naviapp/appsettings/ui/screens/PermissionSettingsScreen.kt b/android/app/src/main/java/com/naviapp/appsettings/ui/screens/PermissionSettingsScreen.kt index 0ca3339f24..0a9ed24247 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/ui/screens/PermissionSettingsScreen.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/ui/screens/PermissionSettingsScreen.kt @@ -169,6 +169,9 @@ fun PermissionSettingsScreen( } } ) + if (permissionInfo != state.permissions.last()) { + Spacer(Modifier.height(8.dp)) + } } } } diff --git a/android/app/src/main/java/com/naviapp/appsettings/model/AppSettingsScreenType.kt b/android/app/src/main/java/com/naviapp/appsettings/utils/NotificationScreenConstants.kt similarity index 51% rename from android/app/src/main/java/com/naviapp/appsettings/model/AppSettingsScreenType.kt rename to android/app/src/main/java/com/naviapp/appsettings/utils/NotificationScreenConstants.kt index 38ae705d4e..fefd47725b 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/model/AppSettingsScreenType.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/utils/NotificationScreenConstants.kt @@ -5,7 +5,15 @@ * */ -package com.naviapp.appsettings.model +package com.naviapp.appsettings.utils + +const val MEDIUM = "medium" + +enum class SettingsMedium(val title: String) { + WHATSAPP("WhatsApp"), + SMS("SMS"), + PUSH_NOTIFICATION("Push notifications") +} enum class AppSettingsScreenType { NotificationSettingsScreen, diff --git a/android/app/src/main/java/com/naviapp/appsettings/utils/NotificationSettingsUtils.kt b/android/app/src/main/java/com/naviapp/appsettings/utils/NotificationSettingsUtils.kt new file mode 100644 index 0000000000..48bc9e6ea6 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/appsettings/utils/NotificationSettingsUtils.kt @@ -0,0 +1,116 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.appsettings.utils + +import android.Manifest +import android.app.Activity +import android.content.pm.PackageManager +import android.os.Build +import androidx.activity.compose.ManagedActivityResultLauncher +import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale +import androidx.core.content.ContextCompat +import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_BLACK_BELL_NOTIFICATION +import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_PURPLE_RETRY +import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_SMS +import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_WHATSAPP +import com.naviapp.appsettings.activity.AppSettingsActivity +import com.naviapp.appsettings.model.notificationSettings.BottomSheetContent +import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsBottomSheetType +import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsUiEvents +import com.naviapp.appsettings.model.notificationSettings.SettingsState +import com.naviapp.appsettings.viewmodel.NotificationSettingsVM +import com.naviapp.models.response.NotificationSettings + +fun hasNotificationPermission(context: Activity): Boolean { + return ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == + PackageManager.PERMISSION_GRANTED +} + +fun getNotificationPermission( + activity: AppSettingsActivity, + permissionLauncher: ManagedActivityResultLauncher, + viewModel: NotificationSettingsVM +) { + if ( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + shouldShowRequestPermissionRationale(activity, Manifest.permission.POST_NOTIFICATIONS) + ) { + permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } else { + viewModel.sendEvent( + NotificationSettingsUiEvents.ShowBottomSheet( + bottomSheetContent = + BottomSheetContent( + composableType = NotificationSettingsBottomSheetType.OPEN_SETTINGS + ) + ) + ) + } +} + +fun handleNotificationSettingChange( + viewModel: NotificationSettingsVM, + notificationSettings: List +) { + viewModel.updateCommunicationMediums( + type = MEDIUM, + notificationSettings = notificationSettings, + naeScreenName = AppSettingsScreenType.NotificationSettingsScreen.name + ) +} + +fun getIconCodeFromMedium(medium: SettingsMedium?): String { + return when (medium) { + SettingsMedium.WHATSAPP -> ICON_WHATSAPP + SettingsMedium.SMS -> ICON_SMS + SettingsMedium.PUSH_NOTIFICATION -> ICON_BLACK_BELL_NOTIFICATION + else -> ICON_PURPLE_RETRY + } +} + +fun enableAllNotifications( + settingsState: SettingsState.Success, + activity: AppSettingsActivity, + viewModel: NotificationSettingsVM, + permissionLauncher: ManagedActivityResultLauncher +) { + val updatedList = + settingsState.notificationSettingsList.map { notificationSetting -> + if (notificationSetting.medium == SettingsMedium.PUSH_NOTIFICATION) { + notificationSetting.copy(enabled = hasNotificationPermission(activity)) + } else { + notificationSetting.copy(enabled = true) + } + } + handleNotificationSettingChange(viewModel, updatedList) + if (hasNotificationPermission(activity).not()) { + getNotificationPermission(activity, permissionLauncher, viewModel) + } +} + +fun onNotificationToggleChange( + setting: NotificationSettings, + enabled: Boolean, + activity: AppSettingsActivity, + permissionLauncher: ManagedActivityResultLauncher, + viewModel: NotificationSettingsVM +) { + if ( + setting.medium == SettingsMedium.PUSH_NOTIFICATION && + enabled && + !hasNotificationPermission(activity) + ) { + getNotificationPermission( + activity = activity, + permissionLauncher = permissionLauncher, + viewModel + ) + } else { + handleNotificationSettingChange(viewModel, listOf(setting.copy(enabled = enabled))) + } +} diff --git a/android/app/src/main/java/com/naviapp/appsettings/utils/PermissionSettingsUtils.kt b/android/app/src/main/java/com/naviapp/appsettings/utils/PermissionSettingsUtils.kt index 25555f9b64..ba609458db 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/utils/PermissionSettingsUtils.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/utils/PermissionSettingsUtils.kt @@ -11,13 +11,11 @@ import android.app.Activity import android.content.pm.PackageManager import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale import androidx.core.content.ContextCompat -import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_WHATSAPP import com.naviapp.appsettings.analytics.AppSettingsAnalytics import com.naviapp.appsettings.model.permissionSettings.PermissionGroup import com.naviapp.appsettings.model.permissionSettings.PermissionGroup.Contacts import com.naviapp.appsettings.model.permissionSettings.PermissionGroup.Location import com.naviapp.appsettings.viewmodel.PermissionSettingsVM -import com.naviapp.utils.EMPTY fun hasPermissionFromGroup(context: Activity, permissions: List): Boolean { return permissions.any { permission -> @@ -56,10 +54,3 @@ fun handlePermissions( } } } - -fun getIconCodeFromMedium(medium: String): String { - return when (medium) { - "WHATSAPP" -> ICON_WHATSAPP - else -> EMPTY - } -} diff --git a/android/app/src/main/java/com/naviapp/appsettings/viewmodel/NotificationSettingsVM.kt b/android/app/src/main/java/com/naviapp/appsettings/viewmodel/NotificationSettingsVM.kt index 3d82ccd672..8b8aadc698 100644 --- a/android/app/src/main/java/com/naviapp/appsettings/viewmodel/NotificationSettingsVM.kt +++ b/android/app/src/main/java/com/naviapp/appsettings/viewmodel/NotificationSettingsVM.kt @@ -12,6 +12,8 @@ import com.navi.base.utils.EMPTY import com.navi.common.basemvi.BaseMviViewModel import com.navi.common.basemvi.UiEffect import com.navi.common.network.models.isSuccess +import com.naviapp.appsettings.model.notificationSettings.BottomSheetContent +import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsBottomSheetType import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsUiEvents import com.naviapp.appsettings.model.notificationSettings.NotificationSettingsUiState import com.naviapp.appsettings.model.notificationSettings.SettingsState @@ -32,18 +34,26 @@ constructor(private val repository: NotificationSettingsRepository) : initialState = NotificationSettingsUiState.initial(), reducer = NotificationSettingsReducer() ) { - fun fetchNotificationData(naeScreenName: String) { + fun fetchNotificationData( + naeScreenName: String, + type: String, + notificationPermission: Boolean + ) { viewModelScope.launch(Dispatchers.IO) { try { withTimeout(5000) { - val response = repository.fetchNotificationData(naeScreenName = naeScreenName) + val response = + repository.fetchNotificationData( + naeScreenName = naeScreenName, + type = type, + notificationPermission = notificationPermission + ) if (response.error == null && response.isSuccess()) { sendEvent( NotificationSettingsUiEvents.UpdateNotificationSettingsState( SettingsState.Success( - response.data?.content?.globalNotificationSettings - ?: emptyList() + response.data?.globalNotificationSettings ?: emptyList() ) ) ) @@ -66,18 +76,29 @@ constructor(private val repository: NotificationSettingsRepository) : } fun updateCommunicationMediums( - notificationSettings: NotificationSettings, + notificationSettings: List, + type: String, naeScreenName: String ) { - coroutineScope.launch { + viewModelScope.launch(Dispatchers.IO) { + val currentList = + (state.value.settingsState as SettingsState.Success).notificationSettingsList + val modifiedMap = notificationSettings.associateBy { it.medium } + val updatedList = currentList.map { modifiedMap[it.medium] ?: it } val response = - repository.updateCommunicationMediums(notificationSettings, naeScreenName) + repository.updateCommunicationMediums(type = type, updatedList, naeScreenName) if (response.error == null && response.errors.isNullOrEmpty()) { - sendEvent( - NotificationSettingsUiEvents.UpdateNotificationSettings(notificationSettings) - ) + sendEvent(NotificationSettingsUiEvents.UpdateNotificationSettings(updatedList)) } else { - setErrorData(response.errors, response.error) + sendEvent( + NotificationSettingsUiEvents.ShowBottomSheet( + bottomSheetContent = + BottomSheetContent( + data = getErrorUnifiedResponse(response.errors, response.error), + composableType = NotificationSettingsBottomSheetType.ERROR + ) + ) + ) } } } diff --git a/android/app/src/main/java/com/naviapp/models/response/NotificationSettingsResponse.kt b/android/app/src/main/java/com/naviapp/models/response/NotificationSettingsContent.kt similarity index 55% rename from android/app/src/main/java/com/naviapp/models/response/NotificationSettingsResponse.kt rename to android/app/src/main/java/com/naviapp/models/response/NotificationSettingsContent.kt index 6f3c79131c..9e85eb8c33 100644 --- a/android/app/src/main/java/com/naviapp/models/response/NotificationSettingsResponse.kt +++ b/android/app/src/main/java/com/naviapp/models/response/NotificationSettingsContent.kt @@ -8,19 +8,13 @@ package com.naviapp.models.response import com.google.gson.annotations.SerializedName - -data class NotificationSettingsResponse( - @SerializedName("title") val title: String? = null, - @SerializedName("content") val content: NotificationSettingsContent? = null -) +import com.naviapp.appsettings.utils.SettingsMedium data class NotificationSettingsContent( @SerializedName("global") val globalNotificationSettings: List? = null ) data class NotificationSettings( - @SerializedName("medium") val medium: String? = null, - @SerializedName("title") val title: String? = null, - @SerializedName("description") val description: String? = null, + @SerializedName("medium") val medium: SettingsMedium? = null, @SerializedName("enabled") var enabled: Boolean? = null, ) diff --git a/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt b/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt index eef5784cd2..58821134b0 100644 --- a/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt +++ b/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt @@ -139,7 +139,6 @@ import com.naviapp.models.response.LoginOtpVerifyResponse import com.naviapp.models.response.LoginResponse import com.naviapp.models.response.MandateProviderResponse import com.naviapp.models.response.NotificationSettingsContent -import com.naviapp.models.response.NotificationSettingsResponse import com.naviapp.models.response.OnboardingResponse import com.naviapp.models.response.PanVerificationResponse import com.naviapp.models.response.PartPrePaymentItemsResponse @@ -413,8 +412,9 @@ interface RetrofitService { @Path("loan-account-number") loanAccountNumber: String ): Response> - @PATCH("/v1/communication-profile") + @PUT("/v2/communication-profile") suspend fun updateCommunicationMediums( + @Query("type") type: String, @Body notificationContent: NotificationSettingsContent ): Response> @@ -579,8 +579,11 @@ interface RetrofitService { @Body emiDateChangeDetails: EmiDateChangeDetails ): Response> - @GET("/v1/communication-profile") - suspend fun fetchNotificationData(): Response> + @GET("/v2/communication-profile") + suspend fun fetchNotificationData( + @Query("type") type: String, + @Query("notificationPermission") notificationPermission: Boolean + ): Response> // OneMoney Account Aggregator API calls @POST("/financial-profile/account-aggregator/v1/consent") diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 6aed6a1210..5dde3b3086 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -500,7 +500,7 @@ App settings Payment updates and offers Personal data and information - Transactional communication cannot be disabled as it is important to provide service to you. \n\nWe recommend turning all the notifications on to receive payment updates & best offers + Transactional communication cannot be disabled as it is important to provide service to you. \n\nWe recommend turning all the notifications on to receive payment updates & best offers. Permissions Control your personal data and information. Choose what you share, securely.\n\nWe don’t share your information with any third party. @@ -522,4 +522,11 @@ To help activate UPI To help scan QR codes To enable seamless payments to connections + Allow notifications + App notifications + To enable notification\n\nPhone settings > Apps > Navi > Permissions > notifications + Unable to load + Something went wrong + Please try again later + Okay, got it diff --git a/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt b/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt index f0a1242cca..a491aca549 100644 --- a/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt +++ b/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt @@ -870,7 +870,8 @@ object NaviWidgetIconUtils { const val ICON_SMS = "ICON_SMS" const val ICON_CONTACTS = "ICON_CONTACTS" const val ICON_WHATSAPP = "ICON_WHATSAPP" - const val ICON_RETRY = "ICON_REFRESH" + const val ICON_PURPLE_RETRY = "ICON_PURPLE_RETRY" + const val ICON_BLACK_BELL_NOTIFICATION = "ICON_BLACK_BELL_NOTIFICATION" private const val OFFER_ICON_PURPLE = "OFFER_ICON_PURPLE" private const val OFFER_ICON_WHITE = "OFFER_ICON_WHITE" private const val OFFER_ICON_PURPLE_WITH_BORDER = "OFFER_ICON_PURPLE_WITH_BORDER" @@ -1775,8 +1776,9 @@ object NaviWidgetIconUtils { ICON_CONTACTS -> R.drawable.ic_contacts ICON_SMS -> R.drawable.ic_sms ICON_CAMERA -> R.drawable.ic_camera - ICON_WHATSAPP -> R.drawable.ic_whatsapp - ICON_RETRY -> R.drawable.navi_widgets_ic_refresh + ICON_WHATSAPP -> R.drawable.ic_whatsapp_notification + ICON_PURPLE_RETRY -> R.drawable.ic_purple_retry + ICON_BLACK_BELL_NOTIFICATION -> R.drawable.ic_black_bell_notification BBPS_CATEGORY_ICON_PLACEHOLDER -> R.drawable.navi_widgets_ic_biller_placeholder OFFER_ICON_WHITE -> R.drawable.ic_offer_white OFFER_ICON_PURPLE -> R.drawable.ic_offer_purple diff --git a/android/navi-widgets/src/main/res/drawable/ic_black_bell_notification.xml b/android/navi-widgets/src/main/res/drawable/ic_black_bell_notification.xml new file mode 100644 index 0000000000..ab22c440f2 --- /dev/null +++ b/android/navi-widgets/src/main/res/drawable/ic_black_bell_notification.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/android/navi-widgets/src/main/res/drawable/ic_purple_retry.xml b/android/navi-widgets/src/main/res/drawable/ic_purple_retry.xml new file mode 100644 index 0000000000..16d1243613 --- /dev/null +++ b/android/navi-widgets/src/main/res/drawable/ic_purple_retry.xml @@ -0,0 +1,34 @@ + + + + + + diff --git a/android/navi-widgets/src/main/res/drawable/ic_whatsapp.xml b/android/navi-widgets/src/main/res/drawable/ic_whatsapp_notification.xml similarity index 100% rename from android/navi-widgets/src/main/res/drawable/ic_whatsapp.xml rename to android/navi-widgets/src/main/res/drawable/ic_whatsapp_notification.xml diff --git a/android/navi-widgets/src/main/res/drawable/navi_widgets_ic_refresh.xml b/android/navi-widgets/src/main/res/drawable/navi_widgets_ic_refresh.xml deleted file mode 100644 index 0c8f5825e8..0000000000 --- a/android/navi-widgets/src/main/res/drawable/navi_widgets_ic_refresh.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - -