Skip to content

Commit

Permalink
Merge branch 'trunk' into 13441-woo-pos-removal-animation-from-the-ca…
Browse files Browse the repository at this point in the history
…rt-is-missing
  • Loading branch information
kidinov authored Feb 11, 2025
2 parents e6cb00d + 46bb108 commit 8f502a2
Show file tree
Hide file tree
Showing 16 changed files with 88 additions and 9 deletions.
1 change: 0 additions & 1 deletion WooCommerce-Wear/lint.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- WARNING -->

Expand Down
3 changes: 2 additions & 1 deletion WooCommerce/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,8 @@
<service
android:name=".media.ProductImagesJobService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
android:permission="android.permission.BIND_JOB_SERVICE"
tools:ignore="NewApi" />

<!-- Provider for exposing file URIs on Android 7+ (required for camera) -->
<provider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,8 @@ object AppUrls {

const val BLAZE_CAMPAIGN_CREATION_SURVEY_URL_I1 =
"https://wordpressdotcom.survey.fm/blaze-on-woo-mobile-survey-sept-2024-i1"

// POS
const val WOO_POS_DOCUMENTATION_URL =
"https://woocommerce.com/document/woo-mobile-app-point-of-sale-mode/"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.woocommerce.android.ui.barcodescanner

import androidx.activity.compose.ManagedActivityResultLauncher
import androidx.annotation.StringRes
import androidx.camera.core.ExperimentalGetImage
import androidx.camera.core.ImageProxy
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
Expand Down Expand Up @@ -39,6 +40,7 @@ class BarcodeScanningViewModel @Inject constructor(
fun startCodesRecognition() {
frameChannel = createChannel()
processingJob = launch {
@ExperimentalGetImage
for (frame in frameChannel) {
codeScanner.recogniseCode(frame).let { status ->
when (status) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.woocommerce.android.ui.orders.creation

import android.os.Parcelable
import androidx.camera.core.ExperimentalGetImage
import androidx.camera.core.ImageProxy
import com.woocommerce.android.ui.orders.creation.GoogleBarcodeFormatMapper.BarcodeFormat
import kotlinx.parcelize.Parcelize

interface CodeScanner {
@ExperimentalGetImage
suspend fun recogniseCode(imageProxy: ImageProxy): CodeScannerStatus
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.woocommerce.android.ui.orders.creation

import androidx.camera.core.ExperimentalGetImage
import androidx.camera.core.ImageProxy
import com.google.mlkit.vision.barcode.BarcodeScanner
import com.google.mlkit.vision.barcode.common.Barcode
Expand All @@ -14,8 +15,8 @@ class GoogleMLKitCodeScanner @Inject constructor(
private val barcodeFormatMapper: GoogleBarcodeFormatMapper,
private val inputImageProvider: MediaImageProvider,
) : CodeScanner {
@ExperimentalGetImage
override suspend fun recogniseCode(imageProxy: ImageProxy): CodeScannerStatus = suspendCoroutine { cont ->
@androidx.camera.core.ExperimentalGetImage
val image = inputImageProvider.provideImage(imageProxy)

val barcodeTask = barcodeScanner.process(image)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -25,6 +26,7 @@ import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
Expand All @@ -35,6 +37,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.semantics.contentDescription
Expand All @@ -54,12 +57,20 @@ import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosBackgr
import com.woocommerce.android.ui.woopos.common.composeui.toAdaptivePadding
import com.woocommerce.android.ui.woopos.home.toolbar.WooPosToolbarState.Menu
import com.woocommerce.android.ui.woopos.home.toolbar.WooPosToolbarState.WooPosCardReaderStatus
import com.woocommerce.android.util.ChromeCustomTabUtils
import kotlinx.coroutines.flow.collectLatest

private val TOOLBAR_ELEVATION = 6.dp

@Composable
fun WooPosFloatingToolbar(modifier: Modifier = Modifier) {
val viewModel: WooPosToolbarViewModel = hiltViewModel()
val context = LocalContext.current
LaunchedEffect(Unit) {
viewModel.openUrlEvent.collectLatest { url ->
ChromeCustomTabUtils.launchUrl(context, url)
}
}
WooPosFloatingToolbar(
modifier = modifier,
state = viewModel.state.collectAsState(),
Expand Down Expand Up @@ -239,7 +250,7 @@ private fun PopUpMenu(
onClick: (Menu.MenuItem) -> Unit
) {
WooPosCard(
modifier = modifier.width(214.dp),
modifier = modifier.width(IntrinsicSize.Max),
elevation = TOOLBAR_ELEVATION,
) {
Column {
Expand Down Expand Up @@ -479,14 +490,18 @@ fun PreviewWooPosFloatingToolbarStatusConnectedWithMenu() {
cardReaderStatus = WooPosCardReaderStatus.Connected,
menu = Menu.Visible(
listOf(
Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic
),
Menu.MenuItem(
title = R.string.woopos_exit_confirmation_title,
icon = R.drawable.ic_woo_pos_exit,
),
Menu.MenuItem(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
)
),
)
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.woocommerce.android.ui.woopos.home.toolbar

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.woocommerce.android.AppUrls.WOO_POS_DOCUMENTATION_URL
import com.woocommerce.android.R
import com.woocommerce.android.cardreader.connection.CardReaderStatus
import com.woocommerce.android.cardreader.connection.CardReaderStatus.Connected
Expand All @@ -18,8 +19,11 @@ import com.woocommerce.android.ui.woopos.support.WooPosGetSupportFacade
import com.woocommerce.android.ui.woopos.util.WooPosNetworkStatus
import com.woocommerce.android.viewmodel.ResourceProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
import javax.inject.Inject

Expand All @@ -39,6 +43,9 @@ class WooPosToolbarViewModel @Inject constructor(
)
val state: StateFlow<WooPosToolbarState> = _state

private val _openUrlEvent = MutableSharedFlow<String>()
val openUrlEvent: SharedFlow<String> = _openUrlEvent.asSharedFlow()

init {
viewModelScope.launch {
cardReaderFacade.readerStatus.collect {
Expand Down Expand Up @@ -82,6 +89,11 @@ class WooPosToolbarViewModel @Inject constructor(
viewModelScope.launch {
childrenToParentEventSender.sendToParent(ChildToParentEvent.ExitPosClicked)
}
R.string.woopos_documentation_title -> {
viewModelScope.launch {
_openUrlEvent.emit(WOO_POS_DOCUMENTATION_URL)
}
}
}
}

Expand Down Expand Up @@ -121,6 +133,10 @@ class WooPosToolbarViewModel @Inject constructor(

private companion object {
val toolbarMenuItems = listOf(
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic,
),
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
Expand Down
5 changes: 5 additions & 0 deletions WooCommerce/src/main/res/drawable/woo_pos_info_ic.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">

<path android:fillColor="@android:color/white" android:pathData="M11,7h2v2h-2V7zM11,11h2v6h-2V11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z"/>

</vector>
1 change: 1 addition & 0 deletions WooCommerce/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4295,6 +4295,7 @@

<string name="woopos_exit_confirmation_title">Exit POS</string>
<string name="woopos_get_support_title">Get Support</string>
<string name="woopos_documentation_title">View Documentation</string>
<string name="woopos_exit_dialog_confirmation_close_content_description">Close</string>
<string name="woopos_exit_dialog_confirmation_title">Exit Point of Sale mode?</string>
<string name="woopos_exit_dialog_confirmation_message">Any orders in progress will be lost.</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.woocommerce.android.ui.woopos.home.toolbar

import app.cash.turbine.test
import com.woocommerce.android.AppUrls.WOO_POS_DOCUMENTATION_URL
import com.woocommerce.android.R
import com.woocommerce.android.cardreader.connection.CardReaderStatus
import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderFacade
Expand All @@ -13,6 +15,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.Assertions.assertThat
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
import org.mockito.kotlin.mock
Expand Down Expand Up @@ -79,6 +82,10 @@ class WooPosToolbarViewModelTest {
.isEqualTo(
WooPosToolbarState.Menu.Visible(
listOf(
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic,
),
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
Expand Down Expand Up @@ -206,6 +213,7 @@ class WooPosToolbarViewModelTest {
// GIVEN
whenever(networkStatus.isConnected()).thenReturn(false)
whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.NotConnected()))
whenever(resourceProvider.getString(R.string.woopos_no_internet_message)).thenReturn("No internet")

// WHEN
val viewModel = createViewModel()
Expand All @@ -215,6 +223,27 @@ class WooPosToolbarViewModelTest {
verify(cardReaderFacade, never()).connectToReader()
}

@Test
fun `when Documentation MenuItemClicked, then openUrlEvent should be emitted with proper url`() = runTest {
// GIVEN
val viewModel = createViewModel()
val menuItem = WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.ic_help_24dp
)

viewModel.openUrlEvent.test {
// WHEN
viewModel.onUiEvent(WooPosToolbarUIEvent.MenuItemClicked(menuItem))

// THEN
assertEquals(WOO_POS_DOCUMENTATION_URL, awaitItem())
assertEquals(WooPosToolbarState.Menu.Hidden, viewModel.state.value.menu)

cancelAndConsumeRemainingEvents()
}
}

private fun createViewModel() = WooPosToolbarViewModel(
cardReaderFacade,
childrenToParentEventSender,
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[versions]
agp = '8.5.1'
agp = '8.8.0'
android-billingclient = '5.0.0'
android-desugar = '2.1.3'
android-security-lint = '1.0.1'
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=f8b4f4772d302c8ff580bc40d0f56e715de69b163546944f787c87abf209c961
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip
distributionSha256Sum=296742a352f0b20ec14b143fb684965ad66086c7810b7b255dee216670716175
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
4 changes: 3 additions & 1 deletion gradlew
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#

##############################################################################
#
Expand Down Expand Up @@ -84,7 +86,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
Expand Down
2 changes: 2 additions & 0 deletions gradlew.bat
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem

@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
Expand Down

0 comments on commit 8f502a2

Please sign in to comment.