From d7a9a73d4baf56d6f092f5792b8c9acb51ce7461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 11:03:44 +0200 Subject: [PATCH 1/6] Add analytics --- .../woocommerce/android/analytics/AnalyticsEvent.kt | 2 ++ .../android/ui/main/BottomNavigationPosition.kt | 5 ++++- .../com/woocommerce/android/ui/main/MainActivity.kt | 3 +++ .../android/ui/woopos/tab/WooPosTabController.kt | 8 ++++++-- .../woopos/util/analytics/WooPosAnalyticsEvent.kt | 13 +++++++++++++ 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt index a4eeb4ee4479..48eff8d0736a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -505,6 +505,8 @@ enum class AnalyticsEvent(override val siteless: Boolean = false) : IAnalyticsEv MAIN_TAB_ORDERS_RESELECTED, MAIN_TAB_PRODUCTS_SELECTED, MAIN_TAB_PRODUCTS_RESELECTED, + MAIN_TAB_POS_SELECTED, + MAIN_TAB_POS_RESELECTED, MAIN_TAB_HUB_MENU_SELECTED, MAIN_TAB_HUB_MENU_RESELECTED, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/BottomNavigationPosition.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/BottomNavigationPosition.kt index 3cbc511ff85c..03fec335a95f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/BottomNavigationPosition.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/BottomNavigationPosition.kt @@ -5,12 +5,14 @@ import com.woocommerce.android.R const val MY_STORE_POSITION = 0 const val ORDERS_POSITION = 1 const val PRODUCTS_POSITION = 2 -const val MORE_POSITION = 3 +const val POS_POSITION = 3 +const val MORE_POSITION = 4 enum class BottomNavigationPosition(val position: Int, val id: Int) { MY_STORE(MY_STORE_POSITION, R.id.dashboard), ORDERS(ORDERS_POSITION, R.id.orders), PRODUCTS(PRODUCTS_POSITION, R.id.products), + POS(POS_POSITION, R.id.point_of_sale), MORE(MORE_POSITION, R.id.moreMenu) } @@ -18,6 +20,7 @@ fun findNavigationPositionById(id: Int): BottomNavigationPosition = when (id) { BottomNavigationPosition.MY_STORE.id -> BottomNavigationPosition.MY_STORE BottomNavigationPosition.ORDERS.id -> BottomNavigationPosition.ORDERS BottomNavigationPosition.PRODUCTS.id -> BottomNavigationPosition.PRODUCTS + BottomNavigationPosition.POS.id -> BottomNavigationPosition.POS BottomNavigationPosition.MORE.id -> BottomNavigationPosition.MORE else -> BottomNavigationPosition.MY_STORE } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index f884a9dcdae8..e63c4a57fe43 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -69,6 +69,7 @@ import com.woocommerce.android.ui.main.BottomNavigationPosition.MORE import com.woocommerce.android.ui.main.BottomNavigationPosition.MY_STORE import com.woocommerce.android.ui.main.BottomNavigationPosition.ORDERS import com.woocommerce.android.ui.main.BottomNavigationPosition.PRODUCTS +import com.woocommerce.android.ui.main.BottomNavigationPosition.POS import com.woocommerce.android.ui.main.MainActivityViewModel.BottomBarState import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.Hidden import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.NewFeature @@ -754,6 +755,7 @@ class MainActivity : MY_STORE -> AnalyticsEvent.MAIN_TAB_DASHBOARD_SELECTED ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_SELECTED PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_SELECTED + POS -> AnalyticsEvent.MAIN_TAB_POS_SELECTED MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_SELECTED } AnalyticsTracker.track(stat, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString)) @@ -768,6 +770,7 @@ class MainActivity : MY_STORE -> AnalyticsEvent.MAIN_TAB_DASHBOARD_RESELECTED ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_RESELECTED PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_RESELECTED + POS -> AnalyticsEvent.MAIN_TAB_POS_RESELECTED MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_RESELECTED } AnalyticsTracker.track(stat, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString)) 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..f1a771174c10 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,6 +13,8 @@ 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 com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent +import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsTracker import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -22,7 +24,8 @@ class WooPosTabController @Inject constructor( private val appPrefs: AppPrefs, private val selectedSite: SelectedSite, private val isWooPosEnabled: WooPosIsEnabled, - private val isPosAsTabEnabled: WooPosIsPosAsTabEnabled + private val isPosAsTabEnabled: WooPosIsPosAsTabEnabled, + private val analyticsTracker: WooPosAnalyticsTracker ) : DefaultLifecycleObserver { private lateinit var activity: MainActivity @@ -43,7 +46,7 @@ class WooPosTabController @Inject constructor( override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) - setupPOSTab() + //setupPOSTab() } override fun onResume(owner: LifecycleOwner) { @@ -85,6 +88,7 @@ class WooPosTabController @Inject constructor( } setPOSTabVisibility(isWooPosEnabledValue) appPrefs.setPOSTabVisibilityForSite(selectedSite.getSelectedSiteId(), isWooPosEnabledValue) + analyticsTracker.track(WooPosAnalyticsEvent.Event.TabVisibilityChecked(isWooPosEnabledValue)) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt index dd7e20604597..087b476508b9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt @@ -99,6 +99,19 @@ sealed class WooPosAnalyticsEvent : IAnalyticsEvent { ) } } + + data class TabVisibilityChecked(val isVisible: Boolean) : Event() { + override val name: String = "tab_visibility_checked" + + init { + addProperties( + mapOf( + "is_visible" to isVisible.toString() + ) + ) + } + } + data object ExitTapped : Event() { override val name: String = "exit_menu_item_tapped" } From af7b4fab1c520a5f4c9c8f065223052ece01a86e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 11:59:18 +0200 Subject: [PATCH 2/6] Fix tab navigation listeners logic. --- .../woocommerce/android/ui/main/MainActivity.kt | 11 ++++++++++- .../android/ui/main/MainBottomNavigationView.kt | 9 +++------ .../ui/woopos/tab/WooPosTabController.kt | 17 +++++------------ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index e63c4a57fe43..96718779c1c4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -750,7 +750,7 @@ class MainActivity : binding.bottomNav.setOrderBadgeCount(0) } - override fun onNavItemSelected(navPos: BottomNavigationPosition) { + override fun onNavItemSelected(navPos: BottomNavigationPosition):Boolean { val stat = when (navPos) { MY_STORE -> AnalyticsEvent.MAIN_TAB_DASHBOARD_SELECTED ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_SELECTED @@ -763,6 +763,15 @@ class MainActivity : if (navPos == ORDERS) { viewModel.removeOrderNotifications() } + + if (navPos == POS) { + posTabController.navigateToPOS() + + // Do not keep the tab selected for POS + return false + } + + return true } override fun onNavItemReselected(navPos: BottomNavigationPosition) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainBottomNavigationView.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainBottomNavigationView.kt index 70efc5a73c4c..1de69934320b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainBottomNavigationView.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainBottomNavigationView.kt @@ -31,7 +31,7 @@ class MainBottomNavigationView @JvmOverloads constructor( private lateinit var moreMenuBadge: BadgeDrawable interface MainNavigationListener { - fun onNavItemSelected(navPos: BottomNavigationPosition) + fun onNavItemSelected(navPos: BottomNavigationPosition): Boolean fun onNavItemReselected(navPos: BottomNavigationPosition) } @@ -135,11 +135,8 @@ class MainBottomNavigationView @JvmOverloads constructor( override fun onNavigationItemSelected(item: MenuItem): Boolean { navController?.let { navController -> - val navSuccess = NavigationUI.onNavDestinationSelected(item, navController) - if (navSuccess) { - listener.onNavItemSelected(findNavigationPositionById(item.itemId)) - return true - } + NavigationUI.onNavDestinationSelected(item, navController) + return listener.onNavItemSelected(findNavigationPositionById(item.itemId)) } return false } 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 f1a771174c10..1b4285a001fd 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 @@ -42,11 +42,7 @@ class WooPosTabController @Inject constructor( this.navController = navController activity.lifecycle.addObserver(this) - } - - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - //setupPOSTab() + setPOSTabVisibility(false) } override fun onResume(owner: LifecycleOwner) { @@ -59,13 +55,6 @@ class WooPosTabController @Inject constructor( owner.lifecycle.removeObserver(this) } - private fun setupPOSTab() { - setPOSTabVisibility(false) - if (isPosAsTabEnabled()) { - setupPOSTabNavigation() - } - } - fun refreshPOSTabVisibility() { setPOSTabVisibility(false) if (isPosAsTabEnabled()) { @@ -77,6 +66,10 @@ class WooPosTabController @Inject constructor( } } + fun navigateToPOS() { + activity.startActivity(Intent(activity, WooPosActivity::class.java)) + } + private fun updatePOSTabVisibilityFromPrefs() = setPOSTabVisibility( appPrefs.isPOSTabVisibleForSite(selectedSite.getSelectedSiteId()) ) From 5ad1dbd0b9692cdfa8dca968a57becf483aac23f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 12:07:41 +0200 Subject: [PATCH 3/6] Detekt --- .../kotlin/com/woocommerce/android/ui/main/MainActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index 96718779c1c4..8756f5fbc0cf 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -68,8 +68,8 @@ import com.woocommerce.android.ui.login.LoginActivity import com.woocommerce.android.ui.main.BottomNavigationPosition.MORE import com.woocommerce.android.ui.main.BottomNavigationPosition.MY_STORE import com.woocommerce.android.ui.main.BottomNavigationPosition.ORDERS -import com.woocommerce.android.ui.main.BottomNavigationPosition.PRODUCTS import com.woocommerce.android.ui.main.BottomNavigationPosition.POS +import com.woocommerce.android.ui.main.BottomNavigationPosition.PRODUCTS import com.woocommerce.android.ui.main.MainActivityViewModel.BottomBarState import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.Hidden import com.woocommerce.android.ui.main.MainActivityViewModel.MoreMenuBadgeState.NewFeature @@ -750,7 +750,7 @@ class MainActivity : binding.bottomNav.setOrderBadgeCount(0) } - override fun onNavItemSelected(navPos: BottomNavigationPosition):Boolean { + override fun onNavItemSelected(navPos: BottomNavigationPosition): Boolean { val stat = when (navPos) { MY_STORE -> AnalyticsEvent.MAIN_TAB_DASHBOARD_SELECTED ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_SELECTED From 4a29cd3780ee4a4ce3db4dd3baec92aa8d206e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 12:45:45 +0200 Subject: [PATCH 4/6] Remove unnecessary code --- .../woocommerce/android/analytics/AnalyticsEvent.kt | 1 - .../com/woocommerce/android/ui/main/MainActivity.kt | 6 ++++-- .../android/ui/woopos/tab/WooPosTabController.kt | 12 ------------ 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt index 48eff8d0736a..2462cc5a6f2a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -506,7 +506,6 @@ enum class AnalyticsEvent(override val siteless: Boolean = false) : IAnalyticsEv MAIN_TAB_PRODUCTS_SELECTED, MAIN_TAB_PRODUCTS_RESELECTED, MAIN_TAB_POS_SELECTED, - MAIN_TAB_POS_RESELECTED, MAIN_TAB_HUB_MENU_SELECTED, MAIN_TAB_HUB_MENU_RESELECTED, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index 8756f5fbc0cf..bbc66177abc5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -779,10 +779,12 @@ class MainActivity : MY_STORE -> AnalyticsEvent.MAIN_TAB_DASHBOARD_RESELECTED ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_RESELECTED PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_RESELECTED - POS -> AnalyticsEvent.MAIN_TAB_POS_RESELECTED MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_RESELECTED + else -> null + } + stat?.let { + AnalyticsTracker.track(it, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString)) } - AnalyticsTracker.track(stat, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString)) // if we're at the root scroll the active fragment to the top // TODO bring back clearing the backstack when the navgraphs are fixed to support multiple backstacks: 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 1b4285a001fd..3a4810510488 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 @@ -88,16 +88,4 @@ class WooPosTabController @Inject constructor( private fun setPOSTabVisibility(isVisible: Boolean) { binding.bottomNav.menu.findItem(R.id.point_of_sale)?.isVisible = isVisible } - - private fun setupPOSTabNavigation() { - binding.bottomNav.setOnItemSelectedListener { item -> - when (item.itemId) { - R.id.point_of_sale -> { - activity.startActivity(Intent(activity, WooPosActivity::class.java)) - false // return false to *not* keep the tab selected - } - else -> NavigationUI.onNavDestinationSelected(item, navController) - } - } - } } From 3a507d9f56325e2bb2d6e48f1e876c5c88530638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 20 Jun 2025 15:17:27 +0200 Subject: [PATCH 5/6] Removed unused import. --- .../com/woocommerce/android/ui/woopos/tab/WooPosTabController.kt | 1 - 1 file changed, 1 deletion(-) 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 30eb2659b883..c4ae72666d43 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 @@ -5,7 +5,6 @@ import androidx.lifecycle.DefaultLifecycleObserver 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 From 10aff47abc5106337ff9af0746b4fac641f80b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Mon, 23 Jun 2025 12:46:23 +0200 Subject: [PATCH 6/6] Be explicit about all possible cases --- .../main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index bbc66177abc5..26cb400780c9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -780,7 +780,7 @@ class MainActivity : ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_RESELECTED PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_RESELECTED MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_RESELECTED - else -> null + POS -> null } stat?.let { AnalyticsTracker.track(it, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString))