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 @@