diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 902a21980e..4c5473c8f5 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -97,6 +97,8 @@ + { return dataStoreHelper.get().get(key = KEY_UPI_PRIMARY_ACCOUNT_VPA, defaultValue = "") } + + private suspend fun handleUpiShortcutWidgetMigration() { + coroutineScope { + launch { + // TODO: Remove this migration code after 5.45.0 release + naviPayWidgetManager.get().removeScanAndPayDynamicShortcut() + } + } + } } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayWidget.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayWidget.kt index b33d526de8..221e4935b0 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayWidget.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayWidget.kt @@ -18,8 +18,7 @@ import com.navi.pay.R import com.navi.pay.common.model.view.NaviPayScreenType import com.navi.pay.entry.NaviPayActivity import com.navi.pay.utils.NAVI_PAY_LOCAL_URI_SCHEME -import com.navi.pay.utils.NAVI_PAY_SCAN_AND_PAY_STATIC_WIDGET_CLICKED -import com.navi.pay.utils.NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY +import com.navi.pay.utils.NAVI_PAY_WIDGET_CLICKED_KEY class NaviPayWidget : AppWidgetProvider() { override fun onUpdate( @@ -52,10 +51,7 @@ internal fun updateAppWidget( val intent = Intent(Intent.ACTION_VIEW, uri, context, NaviPayActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - putExtra( - NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY, - NAVI_PAY_SCAN_AND_PAY_STATIC_WIDGET_CLICKED, - ) + putExtra(NAVI_PAY_WIDGET_CLICKED_KEY, "NaviPay_ScanAndPay_StaticWidget_Clicked") } val pendingIntent: PendingIntent = diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/widget/NaviPayWidgetManager.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/widget/NaviPayWidgetManager.kt index 501d065ea9..31b09d7031 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/widget/NaviPayWidgetManager.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/widget/NaviPayWidgetManager.kt @@ -9,50 +9,27 @@ package com.navi.pay.common.widget import android.app.PendingIntent import android.content.Context -import android.content.Intent import android.content.pm.ShortcutInfo import android.content.pm.ShortcutManager -import android.net.Uri import android.os.Build -import androidx.annotation.DrawableRes -import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat -import androidx.core.graphics.drawable.IconCompat import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_ENABLE_SCAN_PAY_PINNED_WIDGET import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_SCAN_AND_PAY_PINNED_WIDGET_REQUEST_MIN_DAYS import com.navi.pay.R import com.navi.pay.analytics.NaviPayAnalytics -import com.navi.pay.common.model.view.NaviPayScreenType import com.navi.pay.common.sync.model.view.SyncEntity import com.navi.pay.common.sync.repository.SyncRepository -import com.navi.pay.entry.NaviPayActivity -import com.navi.pay.utils.NAVI_PAY_LOCAL_URI_SCHEME -import com.navi.pay.utils.NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_CLICKED -import com.navi.pay.utils.NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID -import com.navi.pay.utils.NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY import com.navi.pay.utils.NAVI_PAY_SYNC_TABLE_SCAN_PAY_PINNED_WIDGET_KEY -import com.navi.pay.utils.NEEDS_RESULT import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import kotlin.math.absoluteValue import org.joda.time.DateTime import org.joda.time.Days -/** - * LauncherWidget - When you long press on app icon & option is shown - * - * StaticWidget - When you long press on home screen & select widgets & then select app - * - * PinnedWidget - Adding launcher widget to home screen - * - * TileWidget - Widget appearing in notification panel - */ interface NaviPayWidgetManager { - fun addScanAndPayLauncherWidget() - - fun removeScanAndPayLauncherWidget() + fun removeScanAndPayDynamicShortcut() suspend fun requestScanAndPayPinnedWidget() } @@ -64,53 +41,13 @@ constructor( private val syncRepository: SyncRepository, ) : NaviPayWidgetManager { - private val qrScannerUri by lazy { - Uri.Builder() - .scheme(NAVI_PAY_LOCAL_URI_SCHEME) - .authority(NaviPayScreenType.NAVI_PAY_QR_SCANNER_SCREEN.name) - .build() - } - - private val qrScannerIntent by lazy { - Intent(Intent.ACTION_VIEW, qrScannerUri, context, NaviPayActivity::class.java).apply { - putExtra(NEEDS_RESULT, true) - putExtra( - NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY, - NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_CLICKED, - ) - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - } - } - private val naviPayAnalytics by lazy { NaviPayAnalytics.INSTANCE.NaviPayWidgetManager() } - override fun addScanAndPayLauncherWidget() { - if ( - ShortcutManagerCompat.getDynamicShortcuts(context).any { - it.id == NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID - } - ) { // Already added + override fun removeScanAndPayDynamicShortcut() { + if (ShortcutManagerCompat.isRateLimitingActive(context)) { return } - - val scanAndPayShortcut = - getShortcutObject( - id = NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID, - shortLabel = context.getString(R.string.title_scan_and_pay), - longLabel = context.getString(R.string.title_scan_and_pay), - icon = R.drawable.ic_ps_scan_pay, - intent = qrScannerIntent, - context = context, - ) - - ShortcutManagerCompat.pushDynamicShortcut(context, scanAndPayShortcut) - } - - override fun removeScanAndPayLauncherWidget() { - ShortcutManagerCompat.removeDynamicShortcuts( - context, - listOf(NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID), - ) + ShortcutManagerCompat.removeDynamicShortcuts(context, listOf("scanAndPayShortcutId")) } override suspend fun requestScanAndPayPinnedWidget() { @@ -134,7 +71,7 @@ constructor( if ( shortCutManager.pinnedShortcuts.any { - it.id == NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID && it.isPinned + it.id in listOf("scanAndPayStaticShortcutId", "scanAndPayShortcutId") && it.isPinned } ) { naviPayAnalytics.onScanAndPayPinnedWidgetAlreadyPinned() @@ -166,7 +103,7 @@ constructor( } val scanAndPayShortcut = - ShortcutInfo.Builder(context, NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID) + ShortcutInfo.Builder(context, "scanAndPayStaticShortcutId") .setShortLabel(context.getString(R.string.title_scan_and_pay)) .setLongLabel(context.getString(R.string.title_scan_and_pay)) .build() @@ -194,20 +131,4 @@ constructor( naviPayAnalytics.onScanAndPayPinnedWidgetRequested() } - - private fun getShortcutObject( - id: String, - shortLabel: String, - longLabel: String, - @DrawableRes icon: Int, - intent: Intent, - context: Context, - ): ShortcutInfoCompat { - return ShortcutInfoCompat.Builder(context, id) - .setShortLabel(shortLabel) - .setLongLabel(longLabel) - .setIcon(IconCompat.createWithResource(context, icon)) - .setIntent(intent) - .build() - } } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivity.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivity.kt index 15894ed6da..4eb6089fee 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivity.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivity.kt @@ -165,7 +165,6 @@ class NaviPayActivity : BaseActivity() { val isOnboarded = viewModel.isUserOnboarded() if (isOnboarded) { checkOnboardedUserMandatoryPermissions() - viewModel.addScanAndPayLauncherWidget() } else { if (viewModel.isCustomerStatusDeviceBounded()) { checkOnboardedUserMandatoryPermissions() diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayViewModel.kt index 5327d8114b..8300fcfb33 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayViewModel.kt @@ -47,7 +47,6 @@ import com.navi.pay.common.usecase.SyncUpiLiteMandateInfoUseCase import com.navi.pay.common.utils.generateSHA256Hash import com.navi.pay.common.utils.getIncomingUrlFromIntent import com.navi.pay.common.viewmodel.NaviPayBaseVM -import com.navi.pay.common.widget.NaviPayWidgetManager import com.navi.pay.management.upinumber.list.model.view.toUpiNumberEntity import com.navi.pay.management.upinumber.list.repository.UpiNumberRepository import com.navi.pay.network.di.NaviPayGsonBuilder @@ -95,7 +94,6 @@ constructor( private val upiNumberRepository: UpiNumberRepository, private val syncUpiLiteMandateInfoUseCase: SyncUpiLiteMandateInfoUseCase, @NaviPayGsonBuilder private val gson: Gson, - private val naviPayWidgetManager: NaviPayWidgetManager, private val arcNudgeSyncUseCase: ArcNudgeSyncUseCase, ) : NaviPayBaseVM() { @@ -449,8 +447,6 @@ constructor( } } - fun addScanAndPayLauncherWidget() = naviPayWidgetManager.addScanAndPayLauncherWidget() - override val screenName: String get() = NAVI_PAY_ACTIVITY } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/paymentsummary/viewmodel/PaymentSummaryViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/paymentsummary/viewmodel/PaymentSummaryViewModel.kt index 242e165f36..29f50d9600 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/paymentsummary/viewmodel/PaymentSummaryViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/paymentsummary/viewmodel/PaymentSummaryViewModel.kt @@ -749,7 +749,7 @@ constructor( ) try { naviPayWidgetManager.requestScanAndPayPinnedWidget() - } catch (_: Exception) { + } catch (e: Exception) { // Requesting from bg will crash the app } } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/viewmodel/QrScannerViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/viewmodel/QrScannerViewModel.kt index 2b7b69505d..f64f79e5ff 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/viewmodel/QrScannerViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/viewmodel/QrScannerViewModel.kt @@ -53,7 +53,7 @@ import com.navi.pay.tstore.list.model.view.OrderEntity import com.navi.pay.utils.DEFAULT_CONFIG import com.navi.pay.utils.INVALID_VPA import com.navi.pay.utils.LITMUS_EXPERIMENT_NAVIPAY_FREQUENT_CONTACT_IN_QR_SCANNER -import com.navi.pay.utils.NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY +import com.navi.pay.utils.NAVI_PAY_WIDGET_CLICKED_KEY import com.navi.pay.utils.NOT_LINKED_TO_UPI import com.ramcosta.composedestinations.spec.Direction import dagger.hilt.android.lifecycle.HiltViewModel @@ -166,11 +166,11 @@ constructor( viewModelScope.launch(Dispatchers.IO) { naviPayActivityDataProvider .getIntentData() - ?.getString(NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY) + ?.getString(NAVI_PAY_WIDGET_CLICKED_KEY) ?.let { naviPayAnalytics.onScanAndPayShortcutClicked( naviPaySessionAttributes = getNaviPaySessionAttributes(), - eventName = NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY, + eventName = NAVI_PAY_WIDGET_CLICKED_KEY, eventValue = it, ) } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt index cd4a2a5da2..98688964c3 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt @@ -73,7 +73,6 @@ import com.navi.pay.common.utils.NaviPayCommonUtils import com.navi.pay.common.utils.getMetricInfo import com.navi.pay.common.utils.getSetPinActionPayload import com.navi.pay.common.viewmodel.NaviPayBaseVM -import com.navi.pay.common.widget.NaviPayWidgetManager import com.navi.pay.onboarding.account.add.model.view.AccountType import com.navi.pay.onboarding.binding.model.network.BindDeviceRequest import com.navi.pay.onboarding.binding.model.network.BindDeviceResponse @@ -158,7 +157,6 @@ constructor( private val resourceProvider: ResourceProvider, private val coroutineDispatcherProvider: CoroutineDispatcherProvider, private val linkedAccountsUseCase: LinkedAccountsUseCase, - private val naviPayWidgetManager: NaviPayWidgetManager, private val dataStoreHelper: DataStoreHelper, private val onboardingDataFromIntentProvider: OnboardingIntentDataProvider, private val permissionStateProvider: PermissionStateProvider, @@ -1183,8 +1181,6 @@ constructor( naviPaySessionAttributes = getNaviPaySessionAttributes(), ) - naviPayWidgetManager.addScanAndPayLauncherWidget() - handleNavigationOnCustomerStatus() } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt index 4b507267b0..c663619854 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt @@ -287,13 +287,8 @@ const val NAVI_PAY_DATABASE_UPI_NUMBERS_TABLE_NAME = "upiNumbers" const val NAVI_PAY_DATABASE_VPA_TRANSACTION_INSIGHTS_TABLE_NAME = "vpaTransactionsInsights" const val NAVI_PAY_DATABASE_ORDER_TAG_SUMMARY_TABLE_NAME = "orderTagSummary" -// Dynamic Shortcut -const val NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_SHORTCUT_ID = "scanAndPayShortcutId" -const val NAVI_PAY_SCAN_AND_PAY_WIDGET_ANALYTICS_EVENT_KEY = - "NaviPay_ScanAndPay_Widget_Clicked_Event_Key" -const val NAVI_PAY_SCAN_AND_PAY_LAUNCHER_WIDGET_CLICKED = - "NaviPay_ScanAndPay_Launcher_Widget_Clicked" -const val NAVI_PAY_SCAN_AND_PAY_STATIC_WIDGET_CLICKED = "NaviPay_ScanAndPay_Static_Widget_Clicked" +// Shortcuts & Widgets keys +const val NAVI_PAY_WIDGET_CLICKED_KEY = "NaviPay_Widget_Clicked" // Local URI const val NAVI_PAY_LOCAL_URI_SCHEME = "navipay" diff --git a/android/navi-pay/src/main/res/drawable-v26/np_widget_qr_scan_adaptive_icon.xml b/android/navi-pay/src/main/res/drawable-v26/np_widget_qr_scan_adaptive_icon.xml new file mode 100644 index 0000000000..e1e95ca0bb --- /dev/null +++ b/android/navi-pay/src/main/res/drawable-v26/np_widget_qr_scan_adaptive_icon.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/navi-pay/src/main/res/drawable/np_widget_pay_to_contact.xml b/android/navi-pay/src/main/res/drawable/np_widget_pay_to_contact.xml new file mode 100644 index 0000000000..2ce5bef46c --- /dev/null +++ b/android/navi-pay/src/main/res/drawable/np_widget_pay_to_contact.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/android/navi-pay/src/main/res/drawable/np_widget_qr_scan.xml b/android/navi-pay/src/main/res/drawable/np_widget_qr_scan.xml new file mode 100644 index 0000000000..edf95ed88f --- /dev/null +++ b/android/navi-pay/src/main/res/drawable/np_widget_qr_scan.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/android/navi-pay/src/main/res/drawable/np_widget_transaction_history.xml b/android/navi-pay/src/main/res/drawable/np_widget_transaction_history.xml new file mode 100644 index 0000000000..740c88041b --- /dev/null +++ b/android/navi-pay/src/main/res/drawable/np_widget_transaction_history.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/android/navi-pay/src/main/res/layout/navi_pay_widget.xml b/android/navi-pay/src/main/res/layout/navi_pay_widget.xml index e367af2d94..2d92706b76 100644 --- a/android/navi-pay/src/main/res/layout/navi_pay_widget.xml +++ b/android/navi-pay/src/main/res/layout/navi_pay_widget.xml @@ -8,7 +8,7 @@ android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" - android:src="@drawable/ic_ps_scan_pay" /> + android:src="@drawable/np_widget_qr_scan" /> diff --git a/android/navi-pay/src/main/res/values/colors.xml b/android/navi-pay/src/main/res/values/colors.xml index c19aae28fb..04ccbcab41 100644 --- a/android/navi-pay/src/main/res/values/colors.xml +++ b/android/navi-pay/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - #FF1F002A + #1F002A #22A940 #FFF8EC #FFEAEA diff --git a/android/navi-pay/src/main/res/values/strings.xml b/android/navi-pay/src/main/res/values/strings.xml index a2261b9583..4ded781c80 100644 --- a/android/navi-pay/src/main/res/values/strings.xml +++ b/android/navi-pay/src/main/res/values/strings.xml @@ -79,7 +79,7 @@ Credit line removed successfully Yes Invalid details. Please try again. - Scan & Pay + Scan & pay Send money Transfer now Send money to bank @@ -839,4 +839,6 @@ We apologise for the inconvenience Recharge could not be processed up to + Pay mobile number + Transaction history \ No newline at end of file diff --git a/android/navi-pay/src/main/res/values/styles.xml b/android/navi-pay/src/main/res/values/styles.xml index 5aed5cab11..57077b45d7 100644 --- a/android/navi-pay/src/main/res/values/styles.xml +++ b/android/navi-pay/src/main/res/values/styles.xml @@ -1,7 +1,7 @@