Skip to content

Commit f5cb917

Browse files
authored
Merge pull request #9069 from woocommerce/issue/9055-code-scanner-order-listing-ui
Code scanner UI in the order listing screen
2 parents 09723a8 + debe810 commit f5cb917

File tree

14 files changed

+164
-9
lines changed

14 files changed

+164
-9
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -940,7 +940,8 @@ class MainActivity :
940940
binding.bottomNav.currentPosition = ORDERS
941941
binding.bottomNav.active(ORDERS.position)
942942
val action = OrderListFragmentDirections.actionOrderListFragmentToOrderCreationFragment(
943-
OrderCreateEditViewModel.Mode.Creation
943+
OrderCreateEditViewModel.Mode.Creation,
944+
null
944945
)
945946
navController.navigateSafely(action)
946947
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/OrderNavigator.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ class OrderNavigator @Inject constructor() {
182182
is EditOrder -> {
183183
OrderDetailFragmentDirections
184184
.actionOrderDetailFragmentToOrderCreationFragment(
185-
OrderCreateEditViewModel.Mode.Edit(target.orderId)
185+
OrderCreateEditViewModel.Mode.Edit(target.orderId),
186+
null
186187
).let { fragment.findNavController().navigateSafely(it) }
187188
}
188189
is ViewCustomFields -> {

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.OrderNoteTyp
4343
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FLOW_CREATION
4444
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FLOW_EDITING
4545
import com.woocommerce.android.analytics.AnalyticsTrackerWrapper
46+
import com.woocommerce.android.extensions.isNotNullOrEmpty
4647
import com.woocommerce.android.extensions.runWithContext
4748
import com.woocommerce.android.model.Address
4849
import com.woocommerce.android.model.Order
@@ -172,6 +173,11 @@ class OrderCreateEditViewModel @Inject constructor(
172173
)
173174
}
174175
monitorOrderChanges()
176+
// Presence of barcode indicates that this screen was called from the
177+
// Order listing screen after scanning the barcode.
178+
if (args.sku.isNotNullOrEmpty()) {
179+
fetchProductBySKU(args.sku!!)
180+
}
175181
}
176182
is Mode.Edit -> {
177183
viewModelScope.launch {
@@ -189,7 +195,6 @@ class OrderCreateEditViewModel @Inject constructor(
189195
}
190196
}
191197
}
192-
193198
fun onCustomerNoteEdited(newNote: String) {
194199
_orderDraft.value.let { order ->
195200
tracker.track(

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import com.woocommerce.android.ui.jitm.JitmFragment
4949
import com.woocommerce.android.ui.main.MainActivity
5050
import com.woocommerce.android.ui.main.MainNavigationRouter
5151
import com.woocommerce.android.ui.orders.OrderStatusUpdateSource
52+
import com.woocommerce.android.ui.orders.creation.IsAddProductViaBarcodeScanningEnabled
5253
import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel
5354
import com.woocommerce.android.ui.orders.list.OrderListViewModel.OrderListEvent.ShowErrorSnack
5455
import com.woocommerce.android.ui.orders.list.OrderListViewModel.OrderListEvent.ShowOrderFilters
@@ -87,6 +88,8 @@ class OrderListFragment :
8788
internal lateinit var currencyFormatter: CurrencyFormatter
8889
@Inject
8990
lateinit var feedbackPrefs: FeedbackPrefs
91+
@Inject
92+
lateinit var isAddProductViaBarcodeScanningEnabled: IsAddProductViaBarcodeScanningEnabled
9093

9194
private val viewModel: OrderListViewModel by viewModels()
9295
private var snackBar: Snackbar? = null
@@ -144,6 +147,9 @@ class OrderListFragment :
144147

145148
orderListMenu = menu
146149
searchMenuItem = menu.findItem(R.id.menu_search)
150+
// TODO Remove the barcode setting visibility logic after the feature is in production.
151+
val barcodeOption = menu.findItem(R.id.menu_barcode)
152+
barcodeOption.isVisible = isAddProductViaBarcodeScanningEnabled()
147153
searchView = searchMenuItem?.actionView as SearchView?
148154
searchView?.queryHint = getSearchQueryHint()
149155
}
@@ -256,6 +262,10 @@ class OrderListFragment :
256262
enableSearchListeners()
257263
true
258264
}
265+
R.id.menu_barcode -> {
266+
viewModel.startScan()
267+
true
268+
}
259269
else -> false
260270
}
261271
}
@@ -349,6 +359,9 @@ class OrderListFragment :
349359
is OrderListViewModel.OrderListEvent.ShowIPPDismissConfirmationDialog -> {
350360
showIPPFeedbackDismissConfirmationDialog()
351361
}
362+
is OrderListViewModel.OrderListEvent.OnBarcodeScanned -> {
363+
openOrderCreationFragment(event.code)
364+
}
352365
else -> event.isHandled = false
353366
}
354367
}
@@ -451,12 +464,13 @@ class OrderListFragment :
451464
findNavController().navigateSafely(R.id.action_orderListFragment_to_orderFilterListFragment)
452465
}
453466

454-
private fun openOrderCreationFragment() {
467+
private fun openOrderCreationFragment(code: String? = null) {
455468
OrderDurationRecorder.startRecording()
456469
AnalyticsTracker.track(AnalyticsEvent.ORDERS_ADD_NEW)
457470
findNavController().navigateSafely(
458471
OrderListFragmentDirections.actionOrderListFragmentToOrderCreationFragment(
459-
OrderCreateEditViewModel.Mode.Creation
472+
OrderCreateEditViewModel.Mode.Creation,
473+
code
460474
)
461475
)
462476
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import com.woocommerce.android.notifications.NotificationChannelType
3636
import com.woocommerce.android.tools.NetworkStatus
3737
import com.woocommerce.android.tools.SelectedSite
3838
import com.woocommerce.android.ui.orders.OrderStatusUpdateSource
39+
import com.woocommerce.android.ui.orders.creation.CodeScanner
40+
import com.woocommerce.android.ui.orders.creation.CodeScannerStatus
3941
import com.woocommerce.android.ui.orders.details.OrderDetailRepository
4042
import com.woocommerce.android.ui.orders.filters.domain.GetSelectedOrderFiltersCount
4143
import com.woocommerce.android.ui.orders.filters.domain.GetWCOrderListDescriptorWithFilters
@@ -105,6 +107,7 @@ class OrderListViewModel @Inject constructor(
105107
private val analyticsTracker: AnalyticsTrackerWrapper,
106108
private val appPrefs: AppPrefs,
107109
private val feedbackPrefs: FeedbackPrefs,
110+
private val codeScanner: CodeScanner,
108111
) : ScopedViewModel(savedState), LifecycleOwner {
109112
private val lifecycleRegistry: LifecycleRegistry by lazy {
110113
LifecycleRegistry(this)
@@ -279,6 +282,21 @@ class OrderListViewModel @Inject constructor(
279282
}
280283
}
281284

285+
fun startScan() {
286+
launch {
287+
codeScanner.startScan().collect { status ->
288+
when (status) {
289+
is CodeScannerStatus.Failure -> {
290+
// TODO handle failure case
291+
}
292+
is CodeScannerStatus.Success -> {
293+
triggerEvent(OrderListEvent.OnBarcodeScanned(status.code))
294+
}
295+
}
296+
}
297+
}
298+
}
299+
282300
/**
283301
* Track user clicked to open an order and the status of that order, along with some
284302
* data about the order custom fields
@@ -718,6 +736,8 @@ class OrderListViewModel @Inject constructor(
718736
object ShowIPPDismissConfirmationDialog : OrderListEvent()
719737

720738
data class OpenIPPFeedbackSurveyLink(val url: String) : OrderListEvent()
739+
740+
data class OnBarcodeScanned(val code: String) : OrderListEvent()
721741
}
722742

723743
@Parcelize

WooCommerce/src/main/res/menu/menu_order_list_fragment.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<menu xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
<item
5+
android:id="@+id/menu_barcode"
6+
android:icon="@drawable/ic_barcode"
7+
android:title="@string/scan_barcode"
8+
app:showAsAction="always" />
49
<item
510
android:id="@+id/menu_search"
611
android:icon="@drawable/ic_search_24dp"

WooCommerce/src/main/res/navigation/nav_graph_main.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@
104104
<argument
105105
android:name="mode"
106106
app:argType="com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel$Mode" />
107+
<argument
108+
android:name="sku"
109+
app:argType="string"
110+
app:nullable="true"/>
107111
</action>
108112
</fragment>
109113
<fragment

WooCommerce/src/main/res/navigation/nav_graph_order_creations.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595
<argument
9696
android:name="mode"
9797
app:argType="com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel$Mode" />
98+
<argument
99+
android:name="sku"
100+
app:argType="string"
101+
app:nullable="true"/>
98102
</fragment>
99103
<dialog
100104
android:id="@+id/orderStatusSelectorDialog"

WooCommerce/src/main/res/navigation/nav_graph_orders.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@
245245
<argument
246246
android:name="mode"
247247
app:argType="com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel$Mode" />
248+
<argument
249+
android:name="sku"
250+
app:argType="string"
251+
app:nullable="true"/>
248252
</action>
249253

250254
<action

WooCommerce/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
<string name="emdash" translatable="false">\u2014</string>
100100
<string name="share">Share</string>
101101
<string name="search">Search</string>
102+
<string name="scan_barcode">Scan Barcode</string>
102103
<string name="clear">Clear</string>
103104
<string name="done">Done</string>
104105
<string name="back">Back</string>

0 commit comments

Comments
 (0)