diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt
index 3d02cc9a830..ecb255ef55b 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt
@@ -132,7 +132,8 @@ object AppPrefs {
CUSTOM_FIELDS_TOP_BANNER_DISMISSED,
BLAZE_CAMPAIGN_SELECTED_OBJECTIVE,
BLAZE_CAMPAIGN_OBJECTIVE_SWITCH_CHECKED,
- IS_SITE_WPCOM_SUSPENDED
+ IS_SITE_WPCOM_SUSPENDED,
+ WOO_POS_PAYMENT_SOUND_ENABLED,
}
/**
@@ -287,6 +288,10 @@ object AppPrefs {
get() = getBoolean(DeletablePrefKey.IS_SITE_WPCOM_SUSPENDED, false)
set(value) = setBoolean(DeletablePrefKey.IS_SITE_WPCOM_SUSPENDED, value)
+ var isWooPosPaymentSoundEnabled: Boolean
+ get() = getBoolean(DeletablePrefKey.WOO_POS_PAYMENT_SOUND_ENABLED, true)
+ set(value) = setBoolean(DeletablePrefKey.WOO_POS_PAYMENT_SOUND_ENABLED, value)
+
fun getProductSortingChoice(currentSiteId: Int) = getString(getProductSortingKey(currentSiteId)).orNullIfEmpty()
fun setProductSortingChoice(currentSiteId: Int, value: String) {
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt
index 569e8a02029..f9290a2a3f4 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt
@@ -39,6 +39,8 @@ class AppPrefsWrapper @Inject constructor() {
var isSiteWPComSuspended by AppPrefs::isSiteWPComSuspended
+ var isWooPosPaymentSoundEnabled by AppPrefs::isWooPosPaymentSoundEnabled
+
fun getAppInstallationDate() = AppPrefs.installationDate
fun getReceiptUrl(localSiteId: Int, remoteSiteId: Long, selfHostedSiteId: Long, orderId: Long) =
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt
index 68abca2149b..c4af9eeba95 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt
@@ -28,6 +28,7 @@ class WooPosHomeViewModel @Inject constructor(
private val parentToChildrenEventSender: WooPosParentToChildrenEventSender,
private val wooPosItemsNavigator: WooPosItemsNavigator,
private val analyticsTracker: WooPosAnalyticsTracker,
+ private val appPrefsWrapper: AppPrefsWrapper,
savedStateHandle: SavedStateHandle,
) : ViewModel() {
private val _state = savedStateHandle.getStateFlow(
@@ -219,7 +220,9 @@ class WooPosHomeViewModel @Inject constructor(
wooPosItemsNavigator.sendNavigationEvent(
WooPosItemsNavigator.WooPosItemsScreenNavigationEvent.NavigateBackToItemListScreen
)
- _playChaChingEvent.emit("Cha-Ching")
+ if (appPrefsWrapper.isWooPosPaymentSoundEnabled) {
+ _playChaChingEvent.emit("Cha-Ching")
+ }
}
_state.value = _state.value.copy(
screenPositionState = ScreenPositionState.Checkout.FullScreenTotals
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbar.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbar.kt
index 104d87a1543..a1d8c44b711 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbar.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbar.kt
@@ -11,8 +11,10 @@ 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.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
@@ -23,6 +25,7 @@ import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
+import androidx.compose.material3.Switch
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -32,6 +35,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -274,6 +278,9 @@ private fun PopUpMenuItem(
menuItem: Menu.MenuItem,
onClick: (Menu.MenuItem) -> Unit
) {
+ var isChaChingEnabled by remember {
+ mutableStateOf(menuItem is Menu.MenuItem.Toggleable && menuItem.isToggled)
+ }
TextButton(onClick = { onClick(menuItem) }) {
Spacer(modifier = Modifier.width(WooPosSpacing.Medium.value.toAdaptivePadding()))
Icon(
@@ -293,10 +300,46 @@ private fun PopUpMenuItem(
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
+ if (menuItem is Menu.MenuItem.Toggleable) {
+ ToggleSwitch(
+ isChecked = isChaChingEnabled,
+ onToggleChange = {
+ isChaChingEnabled = it
+ onClick(menuItem.copy(isToggled = !menuItem.isToggled))
+ }
+ )
+ }
Spacer(modifier = Modifier.width(WooPosSpacing.Medium.value.toAdaptivePadding()))
}
}
+@Composable
+fun ToggleSwitch(
+ isChecked: Boolean,
+ onToggleChange: (Boolean) -> Unit
+) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth(),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ WooPosText(
+ modifier = Modifier
+ .padding(vertical = WooPosSpacing.Small.value.toAdaptivePadding())
+ .weight(1f),
+ text = stringResource(id = R.string.woopos_payment_success_sound_setting_title),
+ style = WooPosTypography.BodyMedium,
+ color = MaterialTheme.colorScheme.onSurface,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis,
+ )
+ Switch(
+ checked = isChecked,
+ onCheckedChange = onToggleChange
+ )
+ }
+}
+
@Composable
private fun CardReaderStatusButton(
modifier: Modifier,
@@ -484,15 +527,20 @@ fun PreviewWooPosFloatingToolbarStatusConnectedWithMenu() {
cardReaderStatus = WooPosCardReaderStatus.Connected,
menu = Menu.Visible(
listOf(
- Menu.MenuItem(
+ Menu.MenuItem.Toggleable(
+ title = R.string.woopos_cart_title,
+ icon = R.drawable.woo_pos_info_ic,
+ isToggled = true
+ ),
+ Menu.MenuItem.Standard(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic
),
- Menu.MenuItem(
+ Menu.MenuItem.Standard(
title = R.string.woopos_exit_confirmation_title,
icon = R.drawable.ic_woo_pos_exit,
),
- Menu.MenuItem(
+ Menu.MenuItem.Standard(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
),
diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarState.kt
index dd3ec45ab82..e451591e450 100644
--- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarState.kt
+++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarState.kt
@@ -17,9 +17,20 @@ data class WooPosToolbarState(
data object Hidden : Menu()
data class Visible(val items: List