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..2462cc5a6f2a 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,7 @@ 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_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..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 @@ -68,6 +68,7 @@ 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.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 @@ -749,11 +750,12 @@ 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 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)) @@ -761,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) { @@ -769,8 +780,11 @@ class MainActivity : ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_RESELECTED PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_RESELECTED MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_RESELECTED + POS -> 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/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 093592d1b72c..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 @@ -13,6 +12,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.launch import javax.inject.Inject @@ -20,7 +21,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 @@ -37,11 +39,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) { @@ -54,13 +52,6 @@ class WooPosTabController @Inject constructor( owner.lifecycle.removeObserver(this) } - private fun setupPOSTab() { - setPOSTabVisibility(false) - if (isPosAsTabEnabled()) { - setupPOSTabNavigation() - } - } - fun refreshPOSTabVisibility() { setPOSTabVisibility(false) if (isPosAsTabEnabled()) { @@ -72,6 +63,10 @@ class WooPosTabController @Inject constructor( } } + fun navigateToPOS() { + activity.startActivity(Intent(activity, WooPosActivity::class.java)) + } + private fun updatePOSTabVisibilityFromPrefs() = setPOSTabVisibility( appPrefs.isPOSTabVisibleForSite(selectedSite.getSelectedSiteId()) ) @@ -81,22 +76,11 @@ class WooPosTabController @Inject constructor( val isWooPosEnabledValue = isWooPosEnabled() setPOSTabVisibility(isWooPosEnabledValue) appPrefs.setPOSTabVisibilityForSite(selectedSite.getSelectedSiteId(), isWooPosEnabledValue) + analyticsTracker.track(WooPosAnalyticsEvent.Event.TabVisibilityChecked(isWooPosEnabledValue)) } } 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) - } - } - } } 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 6531486902d4..895f3ccab204 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" }