Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,8 @@ enum class AnalyticsEvent(override val siteless: Boolean = false) : IAnalyticsEv
MAIN_TAB_POS_SELECTED,
MAIN_TAB_HUB_MENU_SELECTED,
MAIN_TAB_HUB_MENU_RESELECTED,
MAIN_TAB_BOOKINGS_SELECTED,
MAIN_TAB_BOOKINGS_RESELECTED,

// -- Settings
SETTING_CHANGE,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.woocommerce.android.ui.bookings

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.material3.Text
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import com.woocommerce.android.R
import com.woocommerce.android.ui.base.TopLevelFragment
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
import com.woocommerce.android.ui.main.AppBarStatus
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class BookingListFragment : TopLevelFragment() {
override val activityAppBarStatus: AppBarStatus
get() = AppBarStatus.Hidden

override fun getFragmentTitle() = getString(R.string.bookings_tab_title)
override fun shouldExpandToolbar(): Boolean = false
override fun scrollToTop() {
return
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
WooThemeWithBackground {
Text("Empty Booking List screen: WIP")
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.woocommerce.android.ui.bookings.tab

import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.woocommerce.android.R
import com.woocommerce.android.databinding.ActivityMainBinding
import com.woocommerce.android.ui.main.MainActivity
import kotlinx.coroutines.launch
import javax.inject.Inject

class BookingsTabController @Inject constructor(
private val showBookingsTab: ShowBookingsTab
) : DefaultLifecycleObserver {
private lateinit var activity: MainActivity
private lateinit var binding: ActivityMainBinding

fun init(
activity: MainActivity,
binding: ActivityMainBinding
) {
this.activity = activity
this.binding = binding
activity.lifecycle.addObserver(this)
}

override fun onResume(owner: LifecycleOwner) {
checkBookingsTabVisibility()
}

override fun onDestroy(owner: LifecycleOwner) {
owner.lifecycle.removeObserver(this)
}

private fun checkBookingsTabVisibility() {
activity.lifecycleScope.launch {
showBookingsTab()
.onSuccess {
binding.bottomNav.menu.findItem(R.id.bookings)?.isVisible = it
}
.onFailure {
// TODO log error or track errors?
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.woocommerce.android.ui.bookings.tab

import com.woocommerce.android.util.FeatureFlag
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject

class ShowBookingsTab @Inject constructor() {
suspend operator fun invoke(): Result<Boolean> = withContext(Dispatchers.IO) {
// Add here: Fetch if site has any published bookable product AND if site is CIAB
return@withContext Result.success(FeatureFlag.BOOKINGS_MVP.isEnabled())
Comment on lines +10 to +11
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JorgeMucientes Do you want to update this logic now, given there's new code in trunk to check for CIAB sites?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the suggestion. I'll address that as part of WOOMOB-1351

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,23 @@ const val MY_STORE_POSITION = 0
const val ORDERS_POSITION = 1
const val PRODUCTS_POSITION = 2
const val POS_POSITION = 3
const val MORE_POSITION = 4
const val BOOKINGS_POSITION = 4
const val MORE_POSITION = 5

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),
BOOKINGS(BOOKINGS_POSITION, R.id.bookings),
MORE(MORE_POSITION, R.id.moreMenu)
}

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.BOOKINGS.id -> BottomNavigationPosition.BOOKINGS
BottomNavigationPosition.POS.id -> BottomNavigationPosition.POS
BottomNavigationPosition.MORE.id -> BottomNavigationPosition.MORE
else -> BottomNavigationPosition.MY_STORE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,12 @@ import com.woocommerce.android.ui.appwidgets.WidgetUpdater
import com.woocommerce.android.ui.base.BaseFragment
import com.woocommerce.android.ui.base.TopLevelFragment
import com.woocommerce.android.ui.base.UIMessageResolver
import com.woocommerce.android.ui.bookings.tab.BookingsTabController
import com.woocommerce.android.ui.common.InfoScreenFragment
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
import com.woocommerce.android.ui.feedback.SurveyType
import com.woocommerce.android.ui.login.LoginActivity
import com.woocommerce.android.ui.main.BottomNavigationPosition.BOOKINGS
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
Expand Down Expand Up @@ -187,6 +189,8 @@ class MainActivity :

@Inject lateinit var posTabController: WooPosTabController

@Inject lateinit var bookingsTabController: BookingsTabController

private val viewModel: MainActivityViewModel by viewModels()

private var unfilledOrderCount: Int = 0
Expand Down Expand Up @@ -332,6 +336,7 @@ class MainActivity :
binding.bottomNav.init(navController, this)

posTabController.initialize(this, binding, navController)
bookingsTabController.init(this, binding)

presenter.takeView(this)

Expand Down Expand Up @@ -756,6 +761,7 @@ class MainActivity :
ORDERS -> AnalyticsEvent.MAIN_TAB_ORDERS_SELECTED
PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_SELECTED
POS -> AnalyticsEvent.MAIN_TAB_POS_SELECTED
BOOKINGS -> AnalyticsEvent.MAIN_TAB_BOOKINGS_SELECTED
MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_SELECTED
}
AnalyticsTracker.track(stat, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString))
Expand All @@ -781,6 +787,7 @@ class MainActivity :
PRODUCTS -> AnalyticsEvent.MAIN_TAB_PRODUCTS_RESELECTED
MORE -> AnalyticsEvent.MAIN_TAB_HUB_MENU_RESELECTED
POS -> null
BOOKINGS -> AnalyticsEvent.MAIN_TAB_BOOKINGS_RESELECTED
}
stat?.let {
AnalyticsTracker.track(it, mapOf(KEY_HORIZONTAL_SIZE_CLASS to deviceTypeToAnalyticsString))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,15 @@ class MainBottomNavigationView @JvmOverloads constructor(
listener.onNavItemReselected(navPos)
}

/**
* Currently BottomNavigationView support a maximum of 5 tabs. We need to override that limit to enable
* adding or removing tabs based on the user's site type/configuration. However, there shouldn't be any
* scenario where we end up displaying more than 5 tabs at once.
*/
override fun getMaxItemCount(): Int {
return OVERRIDEN_MAX_ITEM_COUNT
}

private fun assignNavigationListeners(assign: Boolean) {
setOnItemSelectedListener(if (assign) this else null)
setOnItemReselectedListener(if (assign) this else null)
Expand All @@ -167,5 +176,6 @@ class MainBottomNavigationView @JvmOverloads constructor(

companion object {
private const val MAX_CHARACTERS_IN_BADGE = 4
private const val OVERRIDEN_MAX_ITEM_COUNT = 6
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ enum class FeatureFlag {
BETTER_CUSTOMER_SEARCH_M2,
ORDER_CREATION_AUTO_TAX_RATE,
WOO_POS_HISTORICAL_ORDERS_M1,
WOO_POS_LOCAL_CATALOG_M1;
WOO_POS_LOCAL_CATALOG_M1,
BOOKINGS_MVP;

fun isEnabled(context: Context? = null): Boolean {
return when (this) {
Expand All @@ -23,7 +24,8 @@ enum class FeatureFlag {
WC_SHIPPING_BANNER,
BETTER_CUSTOMER_SEARCH_M2,
ORDER_CREATION_AUTO_TAX_RATE,
WOO_POS_LOCAL_CATALOG_M1 -> PackageUtils.isDebugBuild()
WOO_POS_LOCAL_CATALOG_M1,
BOOKINGS_MVP -> PackageUtils.isDebugBuild()
}
}
}
23 changes: 23 additions & 0 deletions WooCommerce/src/main/res/drawable/as_menu_booking_list.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>

<animated-selector
xmlns:android="http://schemas.android.com/apk/res/android">

<item
android:state_focused="true"
android:drawable="@drawable/ic_bookings_tab">
</item>

<item
android:id="@+id/selected"
android:state_selected="true"
android:drawable="@drawable/ic_bookings_tab">
</item>

<item
android:id="@+id/unselected"
android:state_selected="false"
android:drawable="@drawable/ic_bookings_tab">
</item>

</animated-selector>
9 changes: 9 additions & 0 deletions WooCommerce/src/main/res/drawable/ic_bookings_tab.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="16dp"
android:viewportWidth="18"
android:viewportHeight="16">
<path
android:pathData="M3.039,15.768C1.246,15.768 0.316,14.847 0.316,13.07V2.968C0.316,1.192 1.246,0.271 3.039,0.271H14.461C16.254,0.271 17.184,1.192 17.184,2.968V13.07C17.184,14.838 16.254,15.768 14.461,15.768H3.039ZM3.014,14.141H14.469C15.167,14.141 15.557,13.776 15.557,13.054V5.384C15.557,4.653 15.167,4.296 14.469,4.296H3.014C2.325,4.296 1.943,4.653 1.943,5.384V13.054C1.943,13.776 2.325,14.141 3.014,14.141ZM7.148,7.177C6.857,7.177 6.758,7.085 6.758,6.787V6.305C6.758,6.006 6.857,5.915 7.148,5.915H7.638C7.937,5.915 8.036,6.006 8.036,6.305V6.787C8.036,7.085 7.937,7.177 7.638,7.177H7.148ZM9.871,7.177C9.572,7.177 9.472,7.085 9.472,6.787V6.305C9.472,6.006 9.572,5.915 9.871,5.915H10.352C10.651,5.915 10.75,6.006 10.75,6.305V6.787C10.75,7.085 10.651,7.177 10.352,7.177H9.871ZM12.585,7.177C12.286,7.177 12.186,7.085 12.186,6.787V6.305C12.186,6.006 12.286,5.915 12.585,5.915H13.066C13.365,5.915 13.465,6.006 13.465,6.305V6.787C13.465,7.085 13.365,7.177 13.066,7.177H12.585ZM4.434,9.85C4.143,9.85 4.043,9.758 4.043,9.459V8.978C4.043,8.679 4.143,8.588 4.434,8.588H4.923C5.222,8.588 5.322,8.679 5.322,8.978V9.459C5.322,9.758 5.222,9.85 4.923,9.85H4.434ZM7.148,9.85C6.857,9.85 6.758,9.758 6.758,9.459V8.978C6.758,8.679 6.857,8.588 7.148,8.588H7.638C7.937,8.588 8.036,8.679 8.036,8.978V9.459C8.036,9.758 7.937,9.85 7.638,9.85H7.148ZM9.871,9.85C9.572,9.85 9.472,9.758 9.472,9.459V8.978C9.472,8.679 9.572,8.588 9.871,8.588H10.352C10.651,8.588 10.75,8.679 10.75,8.978V9.459C10.75,9.758 10.651,9.85 10.352,9.85H9.871ZM12.585,9.85C12.286,9.85 12.186,9.758 12.186,9.459V8.978C12.186,8.679 12.286,8.588 12.585,8.588H13.066C13.365,8.588 13.465,8.679 13.465,8.978V9.459C13.465,9.758 13.365,9.85 13.066,9.85H12.585ZM4.434,12.523C4.143,12.523 4.043,12.431 4.043,12.132V11.651C4.043,11.352 4.143,11.261 4.434,11.261H4.923C5.222,11.261 5.322,11.352 5.322,11.651V12.132C5.322,12.431 5.222,12.523 4.923,12.523H4.434ZM7.148,12.523C6.857,12.523 6.758,12.431 6.758,12.132V11.651C6.758,11.352 6.857,11.261 7.148,11.261H7.638C7.937,11.261 8.036,11.352 8.036,11.651V12.132C8.036,12.431 7.937,12.523 7.638,12.523H7.148ZM9.871,12.523C9.572,12.523 9.472,12.431 9.472,12.132V11.651C9.472,11.352 9.572,11.261 9.871,11.261H10.352C10.651,11.261 10.75,11.352 10.75,11.651V12.132C10.75,12.431 10.651,12.523 10.352,12.523H9.871Z"
android:fillColor="@color/color_icon_menu"/>
</vector>
5 changes: 5 additions & 0 deletions WooCommerce/src/main/res/menu/menu_bottom_bar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@
android:icon="@drawable/as_menu_products_list"
android:title="@string/products" />

<item
android:id="@+id/bookings"
android:icon="@drawable/as_menu_booking_list"
android:title="@string/bookings_tab_title" />

<item
android:id="@+id/point_of_sale"
android:icon="@drawable/as_menu_pos"
Expand Down
5 changes: 5 additions & 0 deletions WooCommerce/src/main/res/navigation/nav_graph_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,11 @@
app:popEnterAnim="@null"
app:popExitAnim="@anim/activity_fade_out" />
</fragment>
<fragment
android:id="@+id/bookings"
android:name="com.woocommerce.android.ui.bookings.BookingListFragment"
android:label="fragment_bookings"
tools:layout="@layout/fragment_bookings" />
<dialog
android:id="@+id/updateStockStatusFragment"
android:name="com.woocommerce.android.ui.products.UpdateProductStockStatusFragment"
Expand Down
6 changes: 6 additions & 0 deletions WooCommerce/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4852,4 +4852,10 @@
<string name="media_library_title">WordPress Media Library</string>
<string name="media_loading_failed">Media loading failed</string>
<string name="no_network_message">There is no network available</string>

<!--
Bookings
-->
<string name="bookings_tab_title">Bookings</string>

</resources>