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 8bdda3441726..10248ececffa 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
@@ -940,7 +940,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 168c511109ef..c90ac665a1d5 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
@@ -43,6 +43,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
@@ -172,6 +173,11 @@ class OrderCreateEditViewModel @Inject constructor(
)
}
monitorOrderChanges()
+ // Presence of barcode indicates that this screen was called from the
+ // Order listing screen after scanning the barcode.
+ if (args.sku.isNotNullOrEmpty()) {
+ fetchProductBySKU(args.sku!!)
+ }
}
is Mode.Edit -> {
viewModelScope.launch {
@@ -189,7 +195,6 @@ class OrderCreateEditViewModel @Inject constructor(
}
}
}
-
fun onCustomerNoteEdited(newNote: String) {
_orderDraft.value.let { order ->
tracker.track(
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..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()
}
@@ -256,6 +262,10 @@ class OrderListFragment :
enableSearchListeners()
true
}
+ R.id.menu_barcode -> {
+ viewModel.startScan()
+ true
+ }
else -> false
}
}
@@ -349,6 +359,9 @@ class OrderListFragment :
is OrderListViewModel.OrderListEvent.ShowIPPDismissConfirmationDialog -> {
showIPPFeedbackDismissConfirmationDialog()
}
+ is OrderListViewModel.OrderListEvent.OnBarcodeScanned -> {
+ openOrderCreationFragment(event.code)
+ }
else -> event.isHandled = false
}
}
@@ -451,12 +464,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
)
)
}
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..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
@@ -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
@@ -105,6 +107,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 +282,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 +736,8 @@ class OrderListViewModel @Inject constructor(
object ShowIPPDismissConfirmationDialog : OrderListEvent()
data class OpenIPPFeedbackSurveyLink(val url: String) : OrderListEvent()
+
+ data class OnBarcodeScanned(val code: String) : OrderListEvent()
}
@Parcelize
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 @@