From f2faf59d338290e18289f685887700753e8a9fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Thu, 19 Jun 2025 12:11:57 +0200 Subject: [PATCH 1/5] Set and get the site POS tab behavior value from prefs for a faster UI show --- .../com/woocommerce/android/AppPrefs.kt | 14 +++++++++++ .../ui/woopos/tab/WooPosTabController.kt | 24 ++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt index 3d02cc9a8304..b4dcabbe403e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt @@ -1176,6 +1176,20 @@ object AppPrefs { return getInt(PrefKeyString(channel.name), 0).takeIf { it != 0 } } + fun setPOSTabVisibilityForSite(siteId: Int, visible: Boolean) { + setBoolean( + key = PrefKeyString("POS_TAB_VISIBILITY:$siteId"), + value = visible + ) + } + + fun isPOSTabVisibleForSite(siteId: Int): Boolean { + return getBoolean( + key = PrefKeyString("POS_TAB_VISIBILITY:$siteId"), + default = false + ) + } + /** * Remove all user and site-related preferences. */ diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt index 1d0339bde854..ccfc08478b95 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt @@ -6,15 +6,21 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.ui.NavigationUI +import com.woocommerce.android.AppPrefs import com.woocommerce.android.R import com.woocommerce.android.databinding.ActivityMainBinding +import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.main.MainActivity import com.woocommerce.android.ui.woopos.WooPosIsEnabled import com.woocommerce.android.ui.woopos.root.WooPosActivity +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject class WooPosTabController @Inject constructor( + private val appPrefs: AppPrefs, + private val selectedSite: SelectedSite, private val isWooPosEnabled: WooPosIsEnabled, private val isPosAsTabEnabled: WooPosIsPosAsTabEnabled ) : DefaultLifecycleObserver { @@ -60,13 +66,25 @@ class WooPosTabController @Inject constructor( fun refreshPOSTabVisibility() { setPOSTabVisibility(false) if (isPosAsTabEnabled()) { - updatePOSTabVisibility() + // Load visibility from prefs for fast UI feedback + updatePOSTabVisibilityFromPrefs() + + // Then update with the remote value + updateTabVisibilityFromRemoteAndPersist() } } - private fun updatePOSTabVisibility() { + private fun updatePOSTabVisibilityFromPrefs() = setPOSTabVisibility( + appPrefs.isPOSTabVisibleForSite(selectedSite.getSelectedSiteId()) + ) + + private fun updateTabVisibilityFromRemoteAndPersist() { activity.lifecycleScope.launch { - setPOSTabVisibility(isWooPosEnabled()) + val isWooPosEnabledValue = withContext(Dispatchers.Default) { + isWooPosEnabled() + } + setPOSTabVisibility(isWooPosEnabledValue) + appPrefs.setPOSTabVisibilityForSite(selectedSite.getSelectedSiteId(), isWooPosEnabledValue) } } From 9fa17e5f263daaf003d62f2342b5da84ac787706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Thu, 19 Jun 2025 12:36:03 +0200 Subject: [PATCH 2/5] Add unit tests --- .../com/woocommerce/android/AppPrefsTest.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt index bbe3685b1464..26ca22a07503 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt @@ -524,4 +524,30 @@ class AppPrefsTest { ) ).isTrue } + + @Test + fun givenSetPOSTabVisibilityForSiteCalledThenGetterReturnsTrue() { + // GIVEN + val siteId = 123 + + // WHEN + AppPrefs.setPOSTabVisibilityForSite(siteId, true) + val result = AppPrefs.isPOSTabVisibleForSite(siteId) + + // THEN + assertThat(result).isTrue + } + + @Test + fun givenPOSTabVisibilityNotSetThenGetterReturnsFalseByDefault() { + // GIVEN + val siteId = 456 + + // WHEN + val result = AppPrefs.isPOSTabVisibleForSite(siteId) + + // THEN + assertThat(result).isFalse + } + } From 49e18ff321a66728fda3e9c59eab83d5d4d424f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Thu, 19 Jun 2025 15:56:47 +0200 Subject: [PATCH 3/5] Add constant for the key --- .../src/main/kotlin/com/woocommerce/android/AppPrefs.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt index b4dcabbe403e..a942904613ef 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt @@ -207,6 +207,8 @@ object AppPrefs { USER_CLICKED_ON_PAYMENTS_MORE_SCREEN, APPLICATION_STORE_SNAPSHOT_TRACKED_FOR_SITE, + + POS_TAB_VISIBILITY, } fun init(context: Context) { @@ -1178,14 +1180,14 @@ object AppPrefs { fun setPOSTabVisibilityForSite(siteId: Int, visible: Boolean) { setBoolean( - key = PrefKeyString("POS_TAB_VISIBILITY:$siteId"), + key = PrefKeyString("${UndeletablePrefKey.POS_TAB_VISIBILITY}:$siteId"), value = visible ) } fun isPOSTabVisibleForSite(siteId: Int): Boolean { return getBoolean( - key = PrefKeyString("POS_TAB_VISIBILITY:$siteId"), + key = PrefKeyString("${UndeletablePrefKey.POS_TAB_VISIBILITY}:$siteId"), default = false ) } From f75fd49a17eef98dddc81db2c53c82f7743936d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 12:12:09 +0200 Subject: [PATCH 4/5] Remove unnecessary code. --- .../woocommerce/android/ui/woopos/tab/WooPosTabController.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt index ccfc08478b95..e0205d7ac05b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt @@ -80,9 +80,7 @@ class WooPosTabController @Inject constructor( private fun updateTabVisibilityFromRemoteAndPersist() { activity.lifecycleScope.launch { - val isWooPosEnabledValue = withContext(Dispatchers.Default) { - isWooPosEnabled() - } + val isWooPosEnabledValue = isWooPosEnabled() setPOSTabVisibility(isWooPosEnabledValue) appPrefs.setPOSTabVisibilityForSite(selectedSite.getSelectedSiteId(), isWooPosEnabledValue) } From 3dc21561a656433c8041b002611e7a95f11a7eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 12:14:20 +0200 Subject: [PATCH 5/5] Detekt --- .../androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt | 1 - .../woocommerce/android/ui/woopos/tab/WooPosTabController.kt | 2 -- 2 files changed, 3 deletions(-) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt index 26ca22a07503..8c5e5c22b214 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/AppPrefsTest.kt @@ -549,5 +549,4 @@ class AppPrefsTest { // THEN assertThat(result).isFalse } - } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt index e0205d7ac05b..093592d1b72c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt @@ -13,9 +13,7 @@ import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.main.MainActivity import com.woocommerce.android.ui.woopos.WooPosIsEnabled import com.woocommerce.android.ui.woopos.root.WooPosActivity -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import javax.inject.Inject class WooPosTabController @Inject constructor(