diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index ac82ec7f13..ea1cfba74d 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -95,10 +95,49 @@
android:windowSoftInputMode="adjustNothing"
tools:ignore="LockedOrientationActivity">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{
FirebaseRemoteConfigHelper.updateRemoteConfigForcefully()
}
+ NotificationConstants.ACTION_ENABLE_FESTIVE_APP_ICON -> {
+ setFestiveAppIconEnabledPreference(enabled = true)
+ }
+ NotificationConstants.ACTION_DISABLE_FESTIVE_APP_ICON -> {
+ setFestiveAppIconEnabledPreference(enabled = false)
+ }
}
NaviTrackEvent.trackEventOnClickStream(
Constants.SILENT_PN_ACTION,
diff --git a/android/app/src/main/res/drawable/ic_navi_republic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_navi_republic_launcher_foreground.xml
new file mode 100644
index 0000000000..88c0a0e942
--- /dev/null
+++ b/android/app/src/main/res/drawable/ic_navi_republic_launcher_foreground.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_festive_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_festive_launcher.xml
new file mode 100644
index 0000000000..2187e5b9f3
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_festive_launcher.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_festive_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_festive_launcher_round.xml
new file mode 100644
index 0000000000..fa4c4b6fd0
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_festive_launcher_round.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_festive_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_festive_launcher.webp
new file mode 100644
index 0000000000..b30dc79b9d
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_festive_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_festive_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_festive_launcher_round.webp
new file mode 100644
index 0000000000..e7f3635b68
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_festive_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_festive_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_festive_launcher.webp
new file mode 100644
index 0000000000..9727410d2f
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_festive_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_festive_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_festive_launcher_round.webp
new file mode 100644
index 0000000000..354d23bfe0
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_festive_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_festive_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_festive_launcher.webp
new file mode 100644
index 0000000000..cc2f0c64b8
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_festive_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_festive_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_festive_launcher_round.webp
new file mode 100644
index 0000000000..7dab994819
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_festive_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_festive_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_festive_launcher.webp
new file mode 100644
index 0000000000..eda035243a
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_festive_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_festive_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_festive_launcher_round.webp
new file mode 100644
index 0000000000..ba892a7e73
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_festive_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_festive_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_festive_launcher.webp
new file mode 100644
index 0000000000..358460131c
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_festive_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_festive_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_festive_launcher_round.webp
new file mode 100644
index 0000000000..67cec3a1d2
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_festive_launcher_round.webp differ
diff --git a/android/app/src/main/res/values/ic_festive_launcher_background.xml b/android/app/src/main/res/values/ic_festive_launcher_background.xml
new file mode 100644
index 0000000000..a1c9486869
--- /dev/null
+++ b/android/app/src/main/res/values/ic_festive_launcher_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ #3C0050
+
diff --git a/android/navi-base/src/main/java/com/navi/base/sharedpref/CommonPrefConstants.kt b/android/navi-base/src/main/java/com/navi/base/sharedpref/CommonPrefConstants.kt
index b5fe7cddf9..a6750de80f 100644
--- a/android/navi-base/src/main/java/com/navi/base/sharedpref/CommonPrefConstants.kt
+++ b/android/navi-base/src/main/java/com/navi/base/sharedpref/CommonPrefConstants.kt
@@ -1,6 +1,6 @@
/*
*
- * * Copyright © 2021-2024 by Navi Technologies Limited
+ * * Copyright © 2021-2025 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
@@ -32,4 +32,5 @@ object CommonPrefConstants {
const val PREVIOUS_LOGGED_IN_EXTERNAL_CUSTOMER_ID = "PREVIOUS_LOGGED_IN_EXTERNAL_CUSTOMER_ID"
const val PREVIOUS_GOOGLE_ADVERTISEMENT_ID = "PREVIOUS_GOOGLE_ADVERTISEMENT_ID"
const val PREVIOUS_APPSFLYER_ID = "PREVIOUS_APPSFLYER_ID"
+ const val IS_FESTIVE_APP_ICON_ENABLED = "IS_FESTIVE_APP_ICON_ENABLED"
}
diff --git a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt
index f3db19443c..55c709f1c0 100644
--- a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt
+++ b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt
@@ -251,6 +251,8 @@ object FirebaseRemoteConfigHelper {
"MONEY_MANAGER_DASHBOARD_SPEND_CATEGORIZATION_TIMEOUT"
const val MM_DARK_MODE_ENABLED = "MM_DARK_MODE_ENABLED"
+ const val IS_FESTIVE_APP_ICON_ENABLED = "IS_FESTIVE_APP_ICON_ENABLED"
+
private fun getFirebaseRemoteConfig(): FirebaseRemoteConfig {
val remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
diff --git a/android/navi-common/src/main/java/com/navi/common/pushnotification/NotificationConstants.kt b/android/navi-common/src/main/java/com/navi/common/pushnotification/NotificationConstants.kt
index 4bf2e97f59..ee601a0a29 100644
--- a/android/navi-common/src/main/java/com/navi/common/pushnotification/NotificationConstants.kt
+++ b/android/navi-common/src/main/java/com/navi/common/pushnotification/NotificationConstants.kt
@@ -1,6 +1,6 @@
/*
*
- * * Copyright © 2020-2024 by Navi Technologies Limited
+ * * Copyright © 2020-2025 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
@@ -55,4 +55,8 @@ object NotificationConstants {
const val MODULE_NAME = "module_name"
const val COLUMN_NAME = "column_name"
const val COMMA_SEPARATED_TABLE_KEYS = "comma_separated_table_keys"
+
+ // Festive App Icon
+ const val ACTION_ENABLE_FESTIVE_APP_ICON = "ACTION_ENABLE_FESTIVE_APP_ICON"
+ const val ACTION_DISABLE_FESTIVE_APP_ICON = "ACTION_DISABLE_FESTIVE_APP_ICON"
}
diff --git a/android/navi-common/src/main/java/com/navi/common/utils/FestiveAppIconUtil.kt b/android/navi-common/src/main/java/com/navi/common/utils/FestiveAppIconUtil.kt
new file mode 100644
index 0000000000..1e14f96bd7
--- /dev/null
+++ b/android/navi-common/src/main/java/com/navi/common/utils/FestiveAppIconUtil.kt
@@ -0,0 +1,85 @@
+/*
+ *
+ * * Copyright © 2025 by Navi Technologies Limited
+ * * All rights reserved. Strictly confidential
+ *
+ */
+
+package com.navi.common.utils
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.pm.PackageManager
+import com.navi.base.sharedpref.CommonPrefConstants
+import com.navi.base.sharedpref.PreferenceManager
+import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
+
+fun setFestiveAppIconEnabledPreference(enabled: Boolean) {
+ PreferenceManager.setBooleanPreferenceApp(
+ key = CommonPrefConstants.IS_FESTIVE_APP_ICON_ENABLED,
+ value = enabled,
+ )
+}
+
+fun Context.handleLauncherIconAlias() {
+ if (
+ FirebaseRemoteConfigHelper.getBoolean(
+ key = FirebaseRemoteConfigHelper.IS_FESTIVE_APP_ICON_ENABLED,
+ defaultValue = false,
+ ) ||
+ PreferenceManager.getBooleanPreferenceApp(
+ key = CommonPrefConstants.IS_FESTIVE_APP_ICON_ENABLED,
+ defValue = false,
+ )
+ ) {
+ enableIconAliasFestive()
+ disableIconAliasDefault()
+ disableIconAliasDefaultClone()
+ } else {
+ enableIconAliasDefaultClone()
+ disableIconAliasFestive()
+ disableIconAliasDefault()
+ }
+}
+
+fun Context.disableIconAliasDefault() {
+ packageManager.setComponentEnabledSetting(
+ ComponentName(this, ICON_ALIAS_CLASS_NAME_PREFIX + "IconAliasDefault"),
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP,
+ )
+}
+
+fun Context.disableIconAliasDefaultClone() {
+ packageManager.setComponentEnabledSetting(
+ ComponentName(this, ICON_ALIAS_CLASS_NAME_PREFIX + "IconAliasDefaultClone"),
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ PackageManager.DONT_KILL_APP,
+ )
+}
+
+fun Context.enableIconAliasDefaultClone() {
+ packageManager.setComponentEnabledSetting(
+ ComponentName(this, ICON_ALIAS_CLASS_NAME_PREFIX + "IconAliasDefaultClone"),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP,
+ )
+}
+
+fun Context.disableIconAliasFestive() {
+ packageManager.setComponentEnabledSetting(
+ ComponentName(this, ICON_ALIAS_CLASS_NAME_PREFIX + "IconAliasFestive"),
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ PackageManager.DONT_KILL_APP,
+ )
+}
+
+fun Context.enableIconAliasFestive() {
+ packageManager.setComponentEnabledSetting(
+ ComponentName(this, ICON_ALIAS_CLASS_NAME_PREFIX + "IconAliasFestive"),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP,
+ )
+}
+
+const val ICON_ALIAS_CLASS_NAME_PREFIX = "com.naviapp.alias."
diff --git a/android/navi-common/src/main/res/xml/default_remote_config.xml b/android/navi-common/src/main/res/xml/default_remote_config.xml
index afd5f3feb4..5ac41a40f4 100644
--- a/android/navi-common/src/main/res/xml/default_remote_config.xml
+++ b/android/navi-common/src/main/res/xml/default_remote_config.xml
@@ -654,4 +654,8 @@
MM_DARK_MODE_ENABLED
false
+
+ IS_FESTIVE_APP_ICON_ENABLED
+ false
+
\ No newline at end of file