From c48338b00c6a399b9a96d1fcba9dddc430f41cd4 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 13:12:21 +0530 Subject: [PATCH 01/19] Add barcode icon into the order listing toolbar --- WooCommerce/src/main/res/menu/menu_order_list_fragment.xml | 5 +++++ WooCommerce/src/main/res/values/strings.xml | 1 + 2 files changed, 6 insertions(+) diff --git a/WooCommerce/src/main/res/menu/menu_order_list_fragment.xml b/WooCommerce/src/main/res/menu/menu_order_list_fragment.xml index 9520bf2858f0..45c20e3ce89e 100644 --- a/WooCommerce/src/main/res/menu/menu_order_list_fragment.xml +++ b/WooCommerce/src/main/res/menu/menu_order_list_fragment.xml @@ -1,6 +1,11 @@ + \u2014 Share Search + Scan Barcode Clear Done Back From ca53d0dea1d97b523101968f55072f8050ba695b Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 13:13:24 +0530 Subject: [PATCH 02/19] Modify the navigation graphs to take in additional SKU parameter --- WooCommerce/src/main/res/navigation/nav_graph_main.xml | 4 ++++ .../src/main/res/navigation/nav_graph_order_creations.xml | 4 ++++ WooCommerce/src/main/res/navigation/nav_graph_orders.xml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/WooCommerce/src/main/res/navigation/nav_graph_main.xml b/WooCommerce/src/main/res/navigation/nav_graph_main.xml index 61d600f23c7c..066e0ee3d3c9 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_main.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_main.xml @@ -104,6 +104,10 @@ + + + Date: Thu, 18 May 2023 13:15:23 +0530 Subject: [PATCH 03/19] Integrate CodeScanner into OrderListViewModel.kt --- .../ui/orders/list/OrderListViewModel.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index cd7d19417b8e..c0f8c0612b4a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -36,6 +36,8 @@ import com.woocommerce.android.notifications.NotificationChannelType import com.woocommerce.android.tools.NetworkStatus import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.orders.OrderStatusUpdateSource +import com.woocommerce.android.ui.orders.creation.CodeScanner +import com.woocommerce.android.ui.orders.creation.CodeScannerStatus import com.woocommerce.android.ui.orders.details.OrderDetailRepository import com.woocommerce.android.ui.orders.filters.domain.GetSelectedOrderFiltersCount import com.woocommerce.android.ui.orders.filters.domain.GetWCOrderListDescriptorWithFilters @@ -47,6 +49,7 @@ import com.woocommerce.android.ui.payments.feedback.ipp.MarkFeedbackBannerAsDism import com.woocommerce.android.ui.payments.feedback.ipp.MarkFeedbackBannerAsDismissedForever import com.woocommerce.android.ui.payments.feedback.ipp.MarkIPPFeedbackSurveyAsCompleted import com.woocommerce.android.ui.payments.feedback.ipp.ShouldShowFeedbackBanner +import com.woocommerce.android.ui.products.ProductListRepository import com.woocommerce.android.util.CoroutineDispatchers import com.woocommerce.android.util.ThrottleLiveData import com.woocommerce.android.util.WooLog @@ -105,6 +108,7 @@ class OrderListViewModel @Inject constructor( private val analyticsTracker: AnalyticsTrackerWrapper, private val appPrefs: AppPrefs, private val feedbackPrefs: FeedbackPrefs, + private val codeScanner: CodeScanner, ) : ScopedViewModel(savedState), LifecycleOwner { private val lifecycleRegistry: LifecycleRegistry by lazy { LifecycleRegistry(this) @@ -279,6 +283,21 @@ class OrderListViewModel @Inject constructor( } } + fun startScan() { + launch { + codeScanner.startScan().collect { status -> + when (status) { + is CodeScannerStatus.Failure -> { + // TODO handle failure case + } + is CodeScannerStatus.Success -> { + triggerEvent(OrderListEvent.OnBarcodeScanned(status.code)) + } + } + } + } + } + /** * Track user clicked to open an order and the status of that order, along with some * data about the order custom fields @@ -718,6 +737,8 @@ class OrderListViewModel @Inject constructor( object ShowIPPDismissConfirmationDialog : OrderListEvent() data class OpenIPPFeedbackSurveyLink(val url: String) : OrderListEvent() + + data class OnBarcodeScanned(val code: String) : OrderListEvent() } @Parcelize From a88ecd3730ceb600a20a9432a49c7dcf030a3eb1 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 13:16:40 +0530 Subject: [PATCH 04/19] Pass the SKU parameter into the Order creation screen. Add logic to search for the SKU if found in the OrderCreateEditViewModel.kt --- .../com/woocommerce/android/ui/main/MainActivity.kt | 3 ++- .../woocommerce/android/ui/orders/OrderNavigator.kt | 3 ++- .../ui/orders/creation/OrderCreateEditViewModel.kt | 3 +++ .../android/ui/orders/list/OrderListFragment.kt | 12 ++++++++++-- 4 files changed, 17 insertions(+), 4 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 89ad76e79b25..21b7bd468f55 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 @@ -927,7 +927,8 @@ class MainActivity : binding.bottomNav.currentPosition = ORDERS binding.bottomNav.active(ORDERS.position) val action = OrderListFragmentDirections.actionOrderListFragmentToOrderCreationFragment( - OrderCreateEditViewModel.Mode.Creation + OrderCreateEditViewModel.Mode.Creation, + null ) navController.navigateSafely(action) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/OrderNavigator.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/OrderNavigator.kt index d76dcb9a1ddb..38960a890300 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/OrderNavigator.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/OrderNavigator.kt @@ -182,7 +182,8 @@ class OrderNavigator @Inject constructor() { is EditOrder -> { OrderDetailFragmentDirections .actionOrderDetailFragmentToOrderCreationFragment( - OrderCreateEditViewModel.Mode.Edit(target.orderId) + OrderCreateEditViewModel.Mode.Edit(target.orderId), + null ).let { fragment.findNavController().navigateSafely(it) } } is ViewCustomFields -> { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index a833c2933c8a..b82decb82f38 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -184,6 +184,9 @@ class OrderCreateEditViewModel @Inject constructor( } } } + args.barcode?.let { code -> + fetchProductBySKU(code) + } } fun onCustomerNoteEdited(newNote: String) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index d54610cf7b11..933d9fa2bc0f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -256,6 +256,10 @@ class OrderListFragment : enableSearchListeners() true } + R.id.menu_barcode -> { + viewModel.startScan() + true + } else -> false } } @@ -349,6 +353,9 @@ class OrderListFragment : is OrderListViewModel.OrderListEvent.ShowIPPDismissConfirmationDialog -> { showIPPFeedbackDismissConfirmationDialog() } + is OrderListViewModel.OrderListEvent.OnBarcodeScanned -> { + openOrderCreationFragment(event.code) + } else -> event.isHandled = false } } @@ -451,12 +458,13 @@ class OrderListFragment : findNavController().navigateSafely(R.id.action_orderListFragment_to_orderFilterListFragment) } - private fun openOrderCreationFragment() { + private fun openOrderCreationFragment(code: String? = null) { OrderDurationRecorder.startRecording() AnalyticsTracker.track(AnalyticsEvent.ORDERS_ADD_NEW) findNavController().navigateSafely( OrderListFragmentDirections.actionOrderListFragmentToOrderCreationFragment( - OrderCreateEditViewModel.Mode.Creation + OrderCreateEditViewModel.Mode.Creation, + code ) ) } From fd186f3952d369296d3db248f980cccef26299c2 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 13:46:16 +0530 Subject: [PATCH 05/19] Move the fetchProductBySKU call when barcode navargs is present into the creation mode logic --- .../ui/orders/creation/OrderCreateEditViewModel.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index b82decb82f38..9c1531070728 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -180,15 +180,16 @@ class OrderCreateEditViewModel @Inject constructor( multipleLinesContext = determineMultipleLinesContext(order) ) monitorOrderChanges() + // Presence of barcode indicates that this screen was called from the + // Order listing screen after scanning the barcode. + args.barcode?.let { code -> + fetchProductBySKU(code) + } } } } } - args.barcode?.let { code -> - fetchProductBySKU(code) - } } - fun onCustomerNoteEdited(newNote: String) { _orderDraft.value.let { order -> tracker.track( From 3f595c9f9fcbf22895827fd1eeb2d4b521389cd5 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 13:46:52 +0530 Subject: [PATCH 06/19] Move the fetchProductBySKU call when barcode navargs is present into the creation mode logic --- .../ui/orders/creation/OrderCreateEditViewModel.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index 9c1531070728..b1f744db3ad6 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -168,6 +168,11 @@ class OrderCreateEditViewModel @Inject constructor( ) } monitorOrderChanges() + // Presence of barcode indicates that this screen was called from the + // Order listing screen after scanning the barcode. + args.barcode?.let { code -> + fetchProductBySKU(code) + } } is Mode.Edit -> { viewModelScope.launch { @@ -180,11 +185,6 @@ class OrderCreateEditViewModel @Inject constructor( multipleLinesContext = determineMultipleLinesContext(order) ) monitorOrderChanges() - // Presence of barcode indicates that this screen was called from the - // Order listing screen after scanning the barcode. - args.barcode?.let { code -> - fetchProductBySKU(code) - } } } } From 0fa2aaddba509f69592925fa0b028c4bb73f85ac Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 13:55:51 +0530 Subject: [PATCH 07/19] Rename "barcode" parameter in the navigation graphs to "sku" for better readability. --- .../android/ui/orders/creation/OrderCreateEditViewModel.kt | 4 ++-- WooCommerce/src/main/res/navigation/nav_graph_main.xml | 2 +- .../src/main/res/navigation/nav_graph_order_creations.xml | 2 +- WooCommerce/src/main/res/navigation/nav_graph_orders.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index b1f744db3ad6..023fa77d7659 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -170,8 +170,8 @@ class OrderCreateEditViewModel @Inject constructor( monitorOrderChanges() // Presence of barcode indicates that this screen was called from the // Order listing screen after scanning the barcode. - args.barcode?.let { code -> - fetchProductBySKU(code) + args.sku?.let { sku -> + fetchProductBySKU(sku) } } is Mode.Edit -> { diff --git a/WooCommerce/src/main/res/navigation/nav_graph_main.xml b/WooCommerce/src/main/res/navigation/nav_graph_main.xml index 066e0ee3d3c9..2ad1f6703a0b 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_main.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_main.xml @@ -105,7 +105,7 @@ android:name="mode" app:argType="com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel$Mode" /> diff --git a/WooCommerce/src/main/res/navigation/nav_graph_order_creations.xml b/WooCommerce/src/main/res/navigation/nav_graph_order_creations.xml index 3add51ba8727..7a410bf6d089 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_order_creations.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_order_creations.xml @@ -83,7 +83,7 @@ android:name="mode" app:argType="com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel$Mode" /> diff --git a/WooCommerce/src/main/res/navigation/nav_graph_orders.xml b/WooCommerce/src/main/res/navigation/nav_graph_orders.xml index 0268fd96cfdd..88ad6cd0df8d 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_orders.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_orders.xml @@ -246,7 +246,7 @@ android:name="mode" app:argType="com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel$Mode" /> From 305556d0079a4bd920c7b1097e248475edbdf065 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 16:13:01 +0530 Subject: [PATCH 08/19] Pass sku as argument --- .../ui/orders/creation/UnifiedOrderEditViewModelTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index fb3dd3c11a0c..296733517c05 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -68,12 +68,13 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { } protected abstract val mode: OrderCreateEditViewModel.Mode + protected abstract val sku: String private fun initMocks() { val defaultOrderItem = createOrderItem() val emptyOrder = Order.EMPTY viewState = OrderCreateEditViewModel.ViewState() - savedState = spy(OrderCreateEditFormFragmentArgs(mode).toSavedStateHandle()) { + savedState = spy(OrderCreateEditFormFragmentArgs(mode, sku).toSavedStateHandle()) { on { getLiveData(viewState.javaClass.name, viewState) } doReturn MutableLiveData(viewState) on { getLiveData(eq(Order.EMPTY.javaClass.name), any()) } doReturn MutableLiveData(emptyOrder) } From 2a9b6a67cea7a17058998aff594e208939a5676e Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 16:15:08 +0530 Subject: [PATCH 09/19] Add test to verify proper event is triggered when the code scan succeeds. --- .../ui/orders/OrderListViewModelTest.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt index e3e8ba78ca1f..901eb2cdef8c 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt @@ -18,6 +18,8 @@ import com.woocommerce.android.model.RequestResult import com.woocommerce.android.notifications.NotificationChannelType import com.woocommerce.android.tools.NetworkStatus import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.orders.creation.CodeScanner +import com.woocommerce.android.ui.orders.creation.CodeScannerStatus import com.woocommerce.android.ui.orders.details.OrderDetailRepository import com.woocommerce.android.ui.orders.filters.domain.GetSelectedOrderFiltersCount import com.woocommerce.android.ui.orders.filters.domain.GetWCOrderListDescriptorWithFilters @@ -98,6 +100,7 @@ class OrderListViewModelTest : BaseUnitTest() { private val analyticsTracker: AnalyticsTrackerWrapper = mock() private val appPrefs = mock() private val feedbackPrefs = mock() + private val codeScanner = mock() @Before fun setup() = testBlocking { @@ -148,6 +151,7 @@ class OrderListViewModelTest : BaseUnitTest() { analyticsTracker = analyticsTracker, appPrefs = appPrefs, feedbackPrefs = feedbackPrefs, + codeScanner = codeScanner, ) @Test @@ -954,6 +958,24 @@ class OrderListViewModelTest : BaseUnitTest() { assertEquals(IPPSurveyFeedbackBannerState.Hidden, viewModel.viewState.ippFeedbackBannerState) } + // region barcode scanner + + @Test + fun `when code scanner succeeds, then trigger proper event`() { + whenever(codeScanner.startScan()).thenAnswer { + flow { + emit(CodeScannerStatus.Success("12345")) + } + } + + viewModel = createViewModel() + viewModel.startScan() + + assertThat(viewModel.event.value).isInstanceOf(OrderListViewModel.OrderListEvent.OnBarcodeScanned::class.java) + } + + //endregion + private companion object { const val ANY_SEARCH_QUERY = "search query" From c425741b2669d1d2333ce4c5a62916f724b34c54 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 16:23:21 +0530 Subject: [PATCH 10/19] implement the abstract variables --- .../creation/CreationFocusedOrderCreateEditViewModelTest.kt | 1 + .../orders/creation/EditFocusedOrderCreateEditViewModelTest.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt index 3acef1138fb4..012f00ff79bc 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt @@ -42,6 +42,7 @@ import java.util.function.Consumer @ExperimentalCoroutinesApi class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTest() { override val mode: Mode = Creation + override val sku: String = "123" override val tracksFlow: String = VALUE_FLOW_CREATION companion object { diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/EditFocusedOrderCreateEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/EditFocusedOrderCreateEditViewModelTest.kt index 84934546ac6e..1aa12506165a 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/EditFocusedOrderCreateEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/EditFocusedOrderCreateEditViewModelTest.kt @@ -27,6 +27,7 @@ import org.mockito.kotlin.verify @RunWith(MockitoJUnitRunner.Silent::class) class EditFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTest() { override val mode: Mode = Edit(defaultOrderValue.id) + override val sku: String = "123" override val tracksFlow: String = VALUE_FLOW_EDITING override fun initMocksForAnalyticsWithOrder(order: Order) { From 61ce0be1752054e299afafceeab9ba72308530ae Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 16:23:58 +0530 Subject: [PATCH 11/19] Add test to verify that the event with proper sku is triggered when the code scan succeeds. --- .../android/ui/orders/OrderListViewModelTest.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt index 901eb2cdef8c..b68c3baf69a6 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt @@ -974,6 +974,20 @@ class OrderListViewModelTest : BaseUnitTest() { assertThat(viewModel.event.value).isInstanceOf(OrderListViewModel.OrderListEvent.OnBarcodeScanned::class.java) } + @Test + fun `when code scanner succeeds, then trigger event with proper sku`() { + whenever(codeScanner.startScan()).thenAnswer { + flow { + emit(CodeScannerStatus.Success("12345")) + } + } + + viewModel = createViewModel() + viewModel.startScan() + + assertThat(viewModel.event.value).isEqualTo(OrderListViewModel.OrderListEvent.OnBarcodeScanned("12345")) + } + //endregion private companion object { From c61a8b40fdae068b246d274b37d23fe29fda0952 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 17:08:27 +0530 Subject: [PATCH 12/19] Add test to verify that the search products call is done when view model is initiated with sku --- .../creation/UnifiedOrderEditViewModelTest.kt | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 296733517c05..a7173810fd10 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -6,6 +6,7 @@ import com.woocommerce.android.WooException import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTrackerWrapper +import com.woocommerce.android.initSavedStateHandle import com.woocommerce.android.model.Address import com.woocommerce.android.model.Order import com.woocommerce.android.ui.orders.OrderTestUtils @@ -25,6 +26,8 @@ import kotlinx.coroutines.flow.flowOf import org.assertj.core.api.Assertions.assertThat import org.junit.Before import org.junit.Test +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyString import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq @@ -420,14 +423,35 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { assertThat(newOrder?.getProductIds()?.any { it == 10L }).isTrue() } } + @Test + fun `given sku, when view model init, then fetch product information`() { + testBlocking { + val navArgs = OrderCreateEditFormFragmentArgs(OrderCreateEditViewModel.Mode.Creation, "123").initSavedStateHandle() + whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( + SiteParameters( + currencyCode = "", + currencySymbol = null, + currencyFormattingParameters = null, + weightUnit = null, + dimensionUnit = null, + gmtOffset = 0F + ) + ) + + verify(productListRepository).searchProductList( + "123", + WCProductStore.SkuSearchOptions(isSkuSearch = true, isExactSkuSearch = true) + ) + } + } //endregion - protected fun createSut() { + protected fun createSut(savedStateHandle: SavedStateHandle = savedState) { autoSyncPriceModifier = AutoSyncPriceModifier(createUpdateOrderUseCase) autoSyncOrder = AutoSyncOrder(createUpdateOrderUseCase) sut = OrderCreateEditViewModel( - savedState = savedState, + savedState = savedStateHandle, dispatchers = coroutinesTestRule.testDispatchers, orderDetailRepository = orderDetailRepository, orderCreateEditRepository = orderCreateEditRepository, From 0b17e4689fa35441821efcf1057fb057e5de361f Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 17:21:46 +0530 Subject: [PATCH 13/19] Add test to verify that the search products call is not done when view model is not initiated with sku --- .../creation/OrderCreateEditViewModel.kt | 5 ++-- .../creation/UnifiedOrderEditViewModelTest.kt | 29 ++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index 023fa77d7659..2fd758f7ea4f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -41,6 +41,7 @@ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.OrderNoteTyp import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FLOW_CREATION import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FLOW_EDITING import com.woocommerce.android.analytics.AnalyticsTrackerWrapper +import com.woocommerce.android.extensions.isNotNullOrEmpty import com.woocommerce.android.extensions.runWithContext import com.woocommerce.android.model.Address import com.woocommerce.android.model.Order @@ -170,8 +171,8 @@ class OrderCreateEditViewModel @Inject constructor( monitorOrderChanges() // Presence of barcode indicates that this screen was called from the // Order listing screen after scanning the barcode. - args.sku?.let { sku -> - fetchProductBySKU(sku) + if (args.sku.isNotNullOrEmpty()) { + fetchProductBySKU(args.sku!!) } } is Mode.Edit -> { diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index a7173810fd10..6b895c6878d9 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -34,6 +34,7 @@ import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.spy +import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import org.wordpress.android.fluxc.network.BaseRequest @@ -438,7 +439,33 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { ) ) - verify(productListRepository).searchProductList( + createSut(navArgs) + + verify(productListRepository, times(2)).searchProductList( + "123", + WCProductStore.SkuSearchOptions(isSkuSearch = true, isExactSkuSearch = true) + ) + } + } + + @Test + fun `given empty sku, when view model init, then do not fetch product information`() { + testBlocking { + val navArgs = OrderCreateEditFormFragmentArgs(OrderCreateEditViewModel.Mode.Creation, "").initSavedStateHandle() + whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( + SiteParameters( + currencyCode = "", + currencySymbol = null, + currencyFormattingParameters = null, + weightUnit = null, + dimensionUnit = null, + gmtOffset = 0F + ) + ) + + createSut(navArgs) + + verify(productListRepository, times(1)).searchProductList( "123", WCProductStore.SkuSearchOptions(isSkuSearch = true, isExactSkuSearch = true) ) From 8a64cae3fe6d67956e9f7438aefffe54f331c4c2 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Thu, 18 May 2023 17:42:48 +0530 Subject: [PATCH 14/19] Fix detekt errors --- .../android/ui/orders/list/OrderListViewModel.kt | 1 - .../orders/creation/UnifiedOrderEditViewModelTest.kt | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index c0f8c0612b4a..0a641b6639c5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -49,7 +49,6 @@ import com.woocommerce.android.ui.payments.feedback.ipp.MarkFeedbackBannerAsDism import com.woocommerce.android.ui.payments.feedback.ipp.MarkFeedbackBannerAsDismissedForever import com.woocommerce.android.ui.payments.feedback.ipp.MarkIPPFeedbackSurveyAsCompleted import com.woocommerce.android.ui.payments.feedback.ipp.ShouldShowFeedbackBanner -import com.woocommerce.android.ui.products.ProductListRepository import com.woocommerce.android.util.CoroutineDispatchers import com.woocommerce.android.util.ThrottleLiveData import com.woocommerce.android.util.WooLog diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 6b895c6878d9..d8c2105d144b 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -26,8 +26,6 @@ import kotlinx.coroutines.flow.flowOf import org.assertj.core.api.Assertions.assertThat import org.junit.Before import org.junit.Test -import org.mockito.ArgumentMatchers.anyBoolean -import org.mockito.ArgumentMatchers.anyString import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq @@ -427,7 +425,9 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { @Test fun `given sku, when view model init, then fetch product information`() { testBlocking { - val navArgs = OrderCreateEditFormFragmentArgs(OrderCreateEditViewModel.Mode.Creation, "123").initSavedStateHandle() + val navArgs = OrderCreateEditFormFragmentArgs( + OrderCreateEditViewModel.Mode.Creation, "123" + ).initSavedStateHandle() whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( SiteParameters( currencyCode = "", @@ -451,7 +451,9 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { @Test fun `given empty sku, when view model init, then do not fetch product information`() { testBlocking { - val navArgs = OrderCreateEditFormFragmentArgs(OrderCreateEditViewModel.Mode.Creation, "").initSavedStateHandle() + val navArgs = OrderCreateEditFormFragmentArgs( + OrderCreateEditViewModel.Mode.Creation, "" + ).initSavedStateHandle() whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( SiteParameters( currencyCode = "", From fdab607c0559c5c3125ec4cd4a22ae80c2596796 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Fri, 19 May 2023 18:48:49 +0530 Subject: [PATCH 15/19] Fix failing tests --- .../ui/orders/creation/UnifiedOrderEditViewModelTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 9951c5815b94..2c999f7a58f1 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -443,7 +443,7 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { verify(productListRepository, times(2)).searchProductList( "123", - WCProductStore.SkuSearchOptions(isSkuSearch = true, isExactSkuSearch = true) + WCProductStore.SkuSearchOptions.ExactSearch ) } } @@ -469,7 +469,7 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { verify(productListRepository, times(1)).searchProductList( "123", - WCProductStore.SkuSearchOptions(isSkuSearch = true, isExactSkuSearch = true) + WCProductStore.SkuSearchOptions.ExactSearch ) } } From 9d77cb51d5c003275be0a888795a1049b504a666 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Fri, 19 May 2023 19:58:03 +0530 Subject: [PATCH 16/19] Fix failing tests --- .../android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 2c999f7a58f1..78f4e91db181 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -409,7 +409,7 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { ) ) ) - whenever(createOrderItemUseCase.invoke(10L)).thenReturn( + whenever(createOrderItemUseCase.invoke(0L, 10L)).thenReturn( createOrderItem(10L) ) var newOrder: Order? = null From cc3398310d4debb8cfb3a3f1848a2f306221936b Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Fri, 19 May 2023 21:18:52 +0530 Subject: [PATCH 17/19] Move tests related to creation into its respective file --- ...tionFocusedOrderCreateEditViewModelTest.kt | 57 +++++++++++++++++++ .../creation/UnifiedOrderEditViewModelTest.kt | 53 +---------------- 2 files changed, 58 insertions(+), 52 deletions(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt index 3bae0413a3a1..d66e087bd934 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/CreationFocusedOrderCreateEditViewModelTest.kt @@ -4,6 +4,7 @@ import com.woocommerce.android.R import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FLOW_CREATION +import com.woocommerce.android.initSavedStateHandle import com.woocommerce.android.model.Address import com.woocommerce.android.model.Order import com.woocommerce.android.ui.orders.OrderNavigationTarget.ViewOrderStatusSelector @@ -21,6 +22,7 @@ import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavi import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.SelectItems import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.ShowCreatedOrder import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget.ShowProductDetails +import com.woocommerce.android.ui.products.models.SiteParameters import com.woocommerce.android.ui.products.selector.ProductSelectorViewModel import com.woocommerce.android.viewmodel.MultiLiveEvent.Event import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit @@ -34,8 +36,11 @@ import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock +import org.mockito.kotlin.times import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever import org.wordpress.android.fluxc.network.rest.wpcom.wc.order.CoreOrderStatus +import org.wordpress.android.fluxc.store.WCProductStore import java.math.BigDecimal import java.util.function.Consumer @@ -1110,4 +1115,56 @@ class CreationFocusedOrderCreateEditViewModelTest : UnifiedOrderEditViewModelTes mapOf(AnalyticsTracker.KEY_FLOW to VALUE_FLOW_CREATION) ) } + + @Test + fun `given sku, when view model init, then fetch product information`() { + testBlocking { + val navArgs = OrderCreateEditFormFragmentArgs( + OrderCreateEditViewModel.Mode.Creation, "123" + ).initSavedStateHandle() + whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( + SiteParameters( + currencyCode = "", + currencySymbol = null, + currencyFormattingParameters = null, + weightUnit = null, + dimensionUnit = null, + gmtOffset = 0F + ) + ) + + createSut(navArgs) + + verify(productListRepository, times(2)).searchProductList( + "123", + WCProductStore.SkuSearchOptions.ExactSearch + ) + } + } + + @Test + fun `given empty sku, when view model init, then do not fetch product information`() { + testBlocking { + val navArgs = OrderCreateEditFormFragmentArgs( + OrderCreateEditViewModel.Mode.Creation, "" + ).initSavedStateHandle() + whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( + SiteParameters( + currencyCode = "", + currencySymbol = null, + currencyFormattingParameters = null, + weightUnit = null, + dimensionUnit = null, + gmtOffset = 0F + ) + ) + + createSut(navArgs) + + verify(productListRepository, times(1)).searchProductList( + "123", + WCProductStore.SkuSearchOptions.ExactSearch + ) + } + } } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 78f4e91db181..9870660b7c21 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -59,7 +59,7 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { private lateinit var determineMultipleLinesContext: DetermineMultipleLinesContext protected lateinit var tracker: AnalyticsTrackerWrapper private lateinit var codeScanner: CodeScanner - private lateinit var productListRepository: ProductListRepository + lateinit var productListRepository: ProductListRepository protected val defaultOrderValue = Order.EMPTY.copy(id = 123) @@ -422,57 +422,6 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { assertThat(newOrder?.getProductIds()?.any { it == 10L }).isTrue() } } - @Test - fun `given sku, when view model init, then fetch product information`() { - testBlocking { - val navArgs = OrderCreateEditFormFragmentArgs( - OrderCreateEditViewModel.Mode.Creation, "123" - ).initSavedStateHandle() - whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( - SiteParameters( - currencyCode = "", - currencySymbol = null, - currencyFormattingParameters = null, - weightUnit = null, - dimensionUnit = null, - gmtOffset = 0F - ) - ) - - createSut(navArgs) - - verify(productListRepository, times(2)).searchProductList( - "123", - WCProductStore.SkuSearchOptions.ExactSearch - ) - } - } - - @Test - fun `given empty sku, when view model init, then do not fetch product information`() { - testBlocking { - val navArgs = OrderCreateEditFormFragmentArgs( - OrderCreateEditViewModel.Mode.Creation, "" - ).initSavedStateHandle() - whenever(parameterRepository.getParameters("parameters_key", navArgs)).thenReturn( - SiteParameters( - currencyCode = "", - currencySymbol = null, - currencyFormattingParameters = null, - weightUnit = null, - dimensionUnit = null, - gmtOffset = 0F - ) - ) - - createSut(navArgs) - - verify(productListRepository, times(1)).searchProductList( - "123", - WCProductStore.SkuSearchOptions.ExactSearch - ) - } - } //endregion From d66a0d46e23ae5406fa86b87631da4efb9b8c798 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Mon, 22 May 2023 07:48:22 +0530 Subject: [PATCH 18/19] Remove unused imports --- .../android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 9870660b7c21..fa48e69c16a5 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -6,7 +6,6 @@ import com.woocommerce.android.WooException import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTrackerWrapper -import com.woocommerce.android.initSavedStateHandle import com.woocommerce.android.model.Address import com.woocommerce.android.model.Order import com.woocommerce.android.ui.orders.OrderTestUtils @@ -32,7 +31,6 @@ import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.spy -import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import org.wordpress.android.fluxc.network.BaseRequest From debe8103977f18d983a4a280e6a844a8d7eb1154 Mon Sep 17 00:00:00 2001 From: Anirudh Uppunda Date: Mon, 22 May 2023 07:56:43 +0530 Subject: [PATCH 19/19] Add barcode setting visibility logic in the order listing screen. The barcode setting will be visible only in the debug build. --- .../woocommerce/android/ui/orders/list/OrderListFragment.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index 933d9fa2bc0f..dda1023ade2e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -49,6 +49,7 @@ import com.woocommerce.android.ui.jitm.JitmFragment import com.woocommerce.android.ui.main.MainActivity import com.woocommerce.android.ui.main.MainNavigationRouter import com.woocommerce.android.ui.orders.OrderStatusUpdateSource +import com.woocommerce.android.ui.orders.creation.IsAddProductViaBarcodeScanningEnabled import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel import com.woocommerce.android.ui.orders.list.OrderListViewModel.OrderListEvent.ShowErrorSnack import com.woocommerce.android.ui.orders.list.OrderListViewModel.OrderListEvent.ShowOrderFilters @@ -87,6 +88,8 @@ class OrderListFragment : internal lateinit var currencyFormatter: CurrencyFormatter @Inject lateinit var feedbackPrefs: FeedbackPrefs + @Inject + lateinit var isAddProductViaBarcodeScanningEnabled: IsAddProductViaBarcodeScanningEnabled private val viewModel: OrderListViewModel by viewModels() private var snackBar: Snackbar? = null @@ -144,6 +147,9 @@ class OrderListFragment : orderListMenu = menu searchMenuItem = menu.findItem(R.id.menu_search) + // TODO Remove the barcode setting visibility logic after the feature is in production. + val barcodeOption = menu.findItem(R.id.menu_barcode) + barcodeOption.isVisible = isAddProductViaBarcodeScanningEnabled() searchView = searchMenuItem?.actionView as SearchView? searchView?.queryHint = getSearchQueryHint() }