From 1196ef021497e4cb2d17d6dca691701dabc571c0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 16:35:24 +0100 Subject: [PATCH 1/6] Add BatteryState enum to floating toolbar state Add BatteryState enum with NOMINAL, LOW, and CRITICAL states. Update Connected status to include battery state information. --- .../home/toolbar/WooPosHomeFloatingToolbarState.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarState.kt index a56618bb72bd..3f49650f943d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarState.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarState.kt @@ -10,10 +10,18 @@ data class WooPosHomeFloatingToolbarState( ) { sealed class WooPosCardReaderStatus(@StringRes val title: Int) { data object NotConnected : WooPosCardReaderStatus(title = R.string.woopos_reader_disconnected) - data object Connected : WooPosCardReaderStatus(title = R.string.woopos_reader_connected) + data class Connected( + val batteryState: BatteryState = BatteryState.NOMINAL + ) : WooPosCardReaderStatus(title = R.string.woopos_reader_connected) data object Reconnecting : WooPosCardReaderStatus(title = R.string.woopos_reader_reconnecting) } + enum class BatteryState { + NOMINAL, + LOW, + CRITICAL + } + sealed class Menu { data object Hidden : Menu() data class Visible(val items: List) : Menu() From 96842f297b800253701487f4db5630ac05933997 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 16:35:31 +0100 Subject: [PATCH 2/6] Add battery status observation to floating toolbar ViewModel Combine readerStatus and batteryStatus flows to map battery state. Map CardReaderBatteryStatus to UI BatteryState: - CRITICAL/LOW battery status -> CRITICAL/LOW state - NOMINAL/UNKNOWN -> NOMINAL state - Warning event -> LOW state Add unit tests for all battery state mapping scenarios. --- .../WooPosHomeFloatingToolbarViewModel.kt | 37 ++++++-- .../WooPosHomeFloatingToolbarViewModelTest.kt | 93 ++++++++++++++++++- 2 files changed, 122 insertions(+), 8 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModel.kt index 907f8e0cba04..5817e6806c43 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModel.kt @@ -8,6 +8,8 @@ import com.woocommerce.android.cardreader.connection.CardReaderStatus.Connected import com.woocommerce.android.cardreader.connection.CardReaderStatus.Connecting import com.woocommerce.android.cardreader.connection.CardReaderStatus.NotConnected import com.woocommerce.android.cardreader.connection.CardReaderStatus.Reconnecting +import com.woocommerce.android.cardreader.connection.event.BatteryStatus +import com.woocommerce.android.cardreader.connection.event.CardReaderBatteryStatus import com.woocommerce.android.ciab.CIABSiteGateKeeper import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderFacade import com.woocommerce.android.ui.woopos.cardreader.connection.WooPosCardReaderConnectionController @@ -27,6 +29,7 @@ import com.woocommerce.android.viewmodel.ResourceProvider import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import javax.inject.Inject @@ -55,10 +58,13 @@ class WooPosHomeFloatingToolbarViewModel @Inject constructor( init { viewModelScope.launch { - cardReaderFacade.readerStatus.collect { - _state.value = _state.value.copy( - cardReaderStatus = mapCardReaderStatusToUiState(it) - ) + combine( + cardReaderFacade.readerStatus, + cardReaderFacade.batteryStatus + ) { readerStatus, batteryStatus -> + mapCardReaderStatusToUiState(readerStatus, batteryStatus) + }.collect { cardReaderStatus -> + _state.value = _state.value.copy(cardReaderStatus = cardReaderStatus) } } } @@ -125,7 +131,7 @@ class WooPosHomeFloatingToolbarViewModel @Inject constructor( private fun handleOnCardReaderStatusClicked() { when (_state.value.cardReaderStatus) { - WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected -> { + is WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected -> { viewModelScope.launch { controller.disconnect() } @@ -153,12 +159,29 @@ class WooPosHomeFloatingToolbarViewModel @Inject constructor( } } - private fun mapCardReaderStatusToUiState(status: CardReaderStatus) = when (status) { - is Connected -> WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected + private fun mapCardReaderStatusToUiState( + status: CardReaderStatus, + batteryStatus: CardReaderBatteryStatus + ): WooPosHomeFloatingToolbarState.WooPosCardReaderStatus = when (status) { + is Connected -> WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected( + batteryState = mapBatteryState(batteryStatus) + ) is NotConnected, Connecting -> WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.NotConnected Reconnecting -> WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Reconnecting } + private fun mapBatteryState(status: CardReaderBatteryStatus): WooPosHomeFloatingToolbarState.BatteryState { + return when (status) { + is CardReaderBatteryStatus.StatusChanged -> when (status.batteryStatus) { + BatteryStatus.CRITICAL -> WooPosHomeFloatingToolbarState.BatteryState.CRITICAL + BatteryStatus.LOW -> WooPosHomeFloatingToolbarState.BatteryState.LOW + BatteryStatus.NOMINAL, BatteryStatus.UNKNOWN -> WooPosHomeFloatingToolbarState.BatteryState.NOMINAL + } + CardReaderBatteryStatus.Warning -> WooPosHomeFloatingToolbarState.BatteryState.LOW + CardReaderBatteryStatus.Unknown -> WooPosHomeFloatingToolbarState.BatteryState.NOMINAL + } + } + private val toolbarMenuItems by lazy { buildList { if (ciabSiteGateKeeper.isCurrentSiteCIAB()) { diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModelTest.kt index b0b3e915fde9..69efff1fe10f 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModelTest.kt @@ -2,12 +2,15 @@ package com.woocommerce.android.ui.woopos.home.toolbar import com.woocommerce.android.R import com.woocommerce.android.cardreader.connection.CardReaderStatus +import com.woocommerce.android.cardreader.connection.event.BatteryStatus +import com.woocommerce.android.cardreader.connection.event.CardReaderBatteryStatus import com.woocommerce.android.ciab.CIABSiteGateKeeper import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderFacade import com.woocommerce.android.ui.woopos.cardreader.connection.WooPosCardReaderConnectionController import com.woocommerce.android.ui.woopos.cardreader.connection.WooPosCardReaderConnectionControllerFactory import com.woocommerce.android.ui.woopos.home.ChildToParentEvent import com.woocommerce.android.ui.woopos.home.WooPosChildrenToParentEventSender +import com.woocommerce.android.ui.woopos.home.toolbar.WooPosHomeFloatingToolbarState.BatteryState import com.woocommerce.android.ui.woopos.util.WooPosCoroutineTestRule import com.woocommerce.android.ui.woopos.util.WooPosNetworkStatus import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.ExitTapped @@ -15,6 +18,7 @@ import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsTracker import com.woocommerce.android.viewmodel.ResourceProvider import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.assertj.core.api.Assertions.assertThat import org.junit.Rule @@ -33,6 +37,7 @@ class WooPosHomeFloatingToolbarViewModelTest { private val cardReaderFacade: WooPosCardReaderFacade = mock { onBlocking { readerStatus }.thenReturn(MutableStateFlow(CardReaderStatus.NotConnected())) + onBlocking { batteryStatus }.thenReturn(flowOf(CardReaderBatteryStatus.Unknown)) } private val childrenToParentEventSender: WooPosChildrenToParentEventSender = mock() private val networkStatus: WooPosNetworkStatus = mock() @@ -65,7 +70,7 @@ class WooPosHomeFloatingToolbarViewModelTest { // THEN assertThat(viewModel.state.value.cardReaderStatus) - .isEqualTo(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected) + .isInstanceOf(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected::class.java) } @Test @@ -315,6 +320,92 @@ class WooPosHomeFloatingToolbarViewModelTest { assertThat(items.any { it.title == R.string.woopos_bookings_title }).isFalse } + @Test + fun `given connected with nominal battery, when initialized, then battery state should be NOMINAL`() = runTest { + // GIVEN + whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.Connected(mock()))) + whenever(cardReaderFacade.batteryStatus).thenReturn( + flowOf(CardReaderBatteryStatus.StatusChanged(0.8f, BatteryStatus.NOMINAL, false)) + ) + + // WHEN + val viewModel = createViewModel() + + // THEN + val status = viewModel.state.value.cardReaderStatus + assertThat(status).isInstanceOf(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected::class.java) + assertThat((status as WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected).batteryState) + .isEqualTo(BatteryState.NOMINAL) + } + + @Test + fun `given connected with low battery, when initialized, then battery state should be LOW`() = runTest { + // GIVEN + whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.Connected(mock()))) + whenever(cardReaderFacade.batteryStatus).thenReturn( + flowOf(CardReaderBatteryStatus.StatusChanged(0.2f, BatteryStatus.LOW, false)) + ) + + // WHEN + val viewModel = createViewModel() + + // THEN + val status = viewModel.state.value.cardReaderStatus + assertThat(status).isInstanceOf(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected::class.java) + assertThat((status as WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected).batteryState) + .isEqualTo(BatteryState.LOW) + } + + @Test + fun `given connected with critical battery, when initialized, then battery state should be CRITICAL`() = runTest { + // GIVEN + whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.Connected(mock()))) + whenever(cardReaderFacade.batteryStatus).thenReturn( + flowOf(CardReaderBatteryStatus.StatusChanged(0.05f, BatteryStatus.CRITICAL, false)) + ) + + // WHEN + val viewModel = createViewModel() + + // THEN + val status = viewModel.state.value.cardReaderStatus + assertThat(status).isInstanceOf(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected::class.java) + assertThat((status as WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected).batteryState) + .isEqualTo(BatteryState.CRITICAL) + } + + @Test + fun `given connected with battery warning, when initialized, then battery state should be LOW`() = runTest { + // GIVEN + whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.Connected(mock()))) + whenever(cardReaderFacade.batteryStatus).thenReturn(flowOf(CardReaderBatteryStatus.Warning)) + + // WHEN + val viewModel = createViewModel() + + // THEN + val status = viewModel.state.value.cardReaderStatus + assertThat(status).isInstanceOf(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected::class.java) + assertThat((status as WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected).batteryState) + .isEqualTo(BatteryState.LOW) + } + + @Test + fun `given connected with unknown battery, when initialized, then battery state should be NOMINAL`() = runTest { + // GIVEN + whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.Connected(mock()))) + whenever(cardReaderFacade.batteryStatus).thenReturn(flowOf(CardReaderBatteryStatus.Unknown)) + + // WHEN + val viewModel = createViewModel() + + // THEN + val status = viewModel.state.value.cardReaderStatus + assertThat(status).isInstanceOf(WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected::class.java) + assertThat((status as WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Connected).batteryState) + .isEqualTo(BatteryState.NOMINAL) + } + private fun createViewModel() = WooPosHomeFloatingToolbarViewModel( cardReaderFacade, childrenToParentEventSender, From 5a036695c27ebc164cf2244ead09993536b690f4 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 16:35:38 +0100 Subject: [PATCH 3/6] Add battery warning icons and accessibility strings Add Material Design battery icons: - ic_woo_pos_battery_low: battery_alert icon for low battery - ic_woo_pos_battery_critical: battery_0_bar icon for critical battery Add accessibility strings for screen readers. --- .../main/res/drawable/ic_woo_pos_battery_critical.xml | 9 +++++++++ .../src/main/res/drawable/ic_woo_pos_battery_low.xml | 9 +++++++++ WooCommerce/src/main/res/values/strings.xml | 2 ++ 3 files changed, 20 insertions(+) create mode 100644 WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml create mode 100644 WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml diff --git a/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml new file mode 100644 index 000000000000..d510483fe98a --- /dev/null +++ b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml @@ -0,0 +1,9 @@ + + + diff --git a/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml new file mode 100644 index 000000000000..4a6f07e39244 --- /dev/null +++ b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml @@ -0,0 +1,9 @@ + + + diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 523fc9c0ff53..8fab28f33080 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -3646,6 +3646,8 @@ Reader connected Connect your reader Reconnecting… + Card reader battery low + Card reader battery critical Check out Remove %s from cart Product %s, Price %s From 74f499d72cf41ad8ca6d0f050d164f885061ae7e Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 16:35:43 +0100 Subject: [PATCH 4/6] Add battery warning icon to floating toolbar UI Display battery warning icon next to connection status dot when battery is LOW (orange) or CRITICAL (red). No icon shown for NOMINAL battery state. Add Compose previews for LOW and CRITICAL battery states. --- .../home/toolbar/WooPosHomeFloatingToolbar.kt | 68 +++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt index 2dc99e349c66..e3755ff06505 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt @@ -305,7 +305,7 @@ private fun CardReaderStatusButton( label = "IllustrationColorTransition" ) { status -> when (status) { - WooPosCardReaderStatus.Connected -> WooPosTheme.colors.success + is WooPosCardReaderStatus.Connected -> WooPosTheme.colors.success WooPosCardReaderStatus.NotConnected -> WooPosTheme.colors.alert WooPosCardReaderStatus.Reconnecting -> WooPosTheme.colors.alert } @@ -318,7 +318,7 @@ private fun CardReaderStatusButton( label = "BorderColorTransition" ) { status -> when (status) { - WooPosCardReaderStatus.Connected -> Color.Transparent + is WooPosCardReaderStatus.Connected -> Color.Transparent WooPosCardReaderStatus.NotConnected -> MaterialTheme.colorScheme.primary WooPosCardReaderStatus.Reconnecting -> WooPosTheme.colors.alert } @@ -351,6 +351,9 @@ private fun CardReaderStatusButton( ) { Spacer(modifier = Modifier.width(WooPosSpacing.Medium.value)) Circle(size = 14.dp, color = illustrationColor) + if (state is WooPosCardReaderStatus.Connected) { + BatteryWarningIcon(batteryState = state.batteryState) + } Spacer(modifier = Modifier.width(WooPosSpacing.XSmall.value)) ReaderStatusText( modifier = Modifier.animateContentSize(), @@ -387,6 +390,31 @@ private fun Circle( ) } +@Composable +private fun BatteryWarningIcon(batteryState: WooPosHomeFloatingToolbarState.BatteryState) { + when (batteryState) { + WooPosHomeFloatingToolbarState.BatteryState.NOMINAL -> { } + WooPosHomeFloatingToolbarState.BatteryState.LOW -> { + Spacer(modifier = Modifier.width(WooPosSpacing.XSmall.value)) + Icon( + imageVector = ImageVector.vectorResource(R.drawable.ic_woo_pos_battery_low), + contentDescription = stringResource(R.string.woopos_battery_low), + tint = WooPosTheme.colors.alert, + modifier = Modifier.size(16.dp) + ) + } + WooPosHomeFloatingToolbarState.BatteryState.CRITICAL -> { + Spacer(modifier = Modifier.width(WooPosSpacing.XSmall.value)) + Icon( + imageVector = ImageVector.vectorResource(R.drawable.ic_woo_pos_battery_critical), + contentDescription = stringResource(R.string.woopos_battery_critical), + tint = MaterialTheme.colorScheme.error, + modifier = Modifier.size(16.dp) + ) + } + } +} + @Composable private fun getToolbarAccessibilityLabels( cardReaderStatus: WooPosCardReaderStatus, @@ -397,7 +425,7 @@ private fun getToolbarAccessibilityLabels( ) val cardReaderStatusContentDescription = when (cardReaderStatus) { - WooPosCardReaderStatus.Connected -> stringResource( + is WooPosCardReaderStatus.Connected -> stringResource( id = R.string.woopos_floating_toolbar_card_reader_connected_status_content_description ) @@ -475,7 +503,7 @@ fun PreviewWooPosFloatingToolbarStatusConnectedWithMenu() { val state = remember { mutableStateOf( WooPosHomeFloatingToolbarState( - cardReaderStatus = WooPosCardReaderStatus.Connected, + cardReaderStatus = WooPosCardReaderStatus.Connected(), menu = Menu.Visible( listOf( Menu.MenuItem( @@ -498,6 +526,38 @@ fun PreviewWooPosFloatingToolbarStatusConnectedWithMenu() { Preview(state) } +@WooPosPreview +@Composable +fun PreviewWooPosFloatingToolbarStatusConnectedBatteryLow() { + val state = remember { + mutableStateOf( + WooPosHomeFloatingToolbarState( + cardReaderStatus = WooPosCardReaderStatus.Connected( + batteryState = WooPosHomeFloatingToolbarState.BatteryState.LOW + ), + menu = Menu.Hidden + ) + ) + } + Preview(state) +} + +@WooPosPreview +@Composable +fun PreviewWooPosFloatingToolbarStatusConnectedBatteryCritical() { + val state = remember { + mutableStateOf( + WooPosHomeFloatingToolbarState( + cardReaderStatus = WooPosCardReaderStatus.Connected( + batteryState = WooPosHomeFloatingToolbarState.BatteryState.CRITICAL + ), + menu = Menu.Hidden + ) + ) + } + Preview(state) +} + @Composable private fun Preview(state: MutableState) { WooPosTheme { From 0f503642ed546129bef1200b5135a42ee20b7ffe Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 16:43:08 +0100 Subject: [PATCH 5/6] Update battery icons with correct Material Design paths Use proper Material Symbols paths with 960x960 viewport. --- .../src/main/res/drawable/ic_woo_pos_battery_critical.xml | 8 ++++---- .../src/main/res/drawable/ic_woo_pos_battery_low.xml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml index d510483fe98a..9042fffba032 100644 --- a/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml +++ b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_critical.xml @@ -1,9 +1,9 @@ + android:viewportWidth="960" + android:viewportHeight="960"> + android:fillColor="@android:color/white" + android:pathData="M440,560L520,560L520,320L440,320L440,560ZM480,720Q497,720 508.5,708.5Q520,697 520,680Q520,663 508.5,651.5Q497,640 480,640Q463,640 451.5,651.5Q440,663 440,680Q440,697 451.5,708.5Q463,720 480,720ZM320,880Q303,880 291.5,868.5Q280,857 280,840L280,200Q280,183 291.5,171.5Q303,160 320,160L400,160L400,80L560,80L560,160L640,160Q657,160 668.5,171.5Q680,183 680,200L680,840Q680,857 668.5,868.5Q657,880 640,880L320,880ZM360,800L600,800L600,240L360,240L360,800ZM360,800L360,800L600,800L600,800L360,800Z" /> diff --git a/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml index 4a6f07e39244..71752932df63 100644 --- a/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml +++ b/WooCommerce/src/main/res/drawable/ic_woo_pos_battery_low.xml @@ -1,9 +1,9 @@ + android:viewportWidth="960" + android:viewportHeight="960"> + android:fillColor="@android:color/white" + android:pathData="M320,880Q303,880 291.5,868.5Q280,857 280,840L280,200Q280,183 291.5,171.5Q303,160 320,160L400,160L400,80L560,80L560,160L640,160Q657,160 668.5,171.5Q680,183 680,200L680,840Q680,857 668.5,868.5Q657,880 640,880L320,880ZM360,720L600,720L600,240L360,240L360,720Z" /> From 99b6bf4bff48723bf40cd9970e471095790a7862 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 16:46:05 +0100 Subject: [PATCH 6/6] Move battery icon after status text and increase size Position battery warning icon after "Reader connected" text. Increase icon size from 16dp to 20dp for better visibility. --- .../home/toolbar/WooPosHomeFloatingToolbar.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt index e3755ff06505..d2b45029dc5e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbar.kt @@ -351,14 +351,16 @@ private fun CardReaderStatusButton( ) { Spacer(modifier = Modifier.width(WooPosSpacing.Medium.value)) Circle(size = 14.dp, color = illustrationColor) - if (state is WooPosCardReaderStatus.Connected) { - BatteryWarningIcon(batteryState = state.batteryState) - } Spacer(modifier = Modifier.width(WooPosSpacing.XSmall.value)) ReaderStatusText( modifier = Modifier.animateContentSize(), title = title, ) + + if (state is WooPosCardReaderStatus.Connected) { + BatteryWarningIcon(batteryState = state.batteryState) + } + Spacer(modifier = Modifier.width(WooPosSpacing.Medium.value)) } } @@ -395,21 +397,19 @@ private fun BatteryWarningIcon(batteryState: WooPosHomeFloatingToolbarState.Batt when (batteryState) { WooPosHomeFloatingToolbarState.BatteryState.NOMINAL -> { } WooPosHomeFloatingToolbarState.BatteryState.LOW -> { - Spacer(modifier = Modifier.width(WooPosSpacing.XSmall.value)) Icon( imageVector = ImageVector.vectorResource(R.drawable.ic_woo_pos_battery_low), contentDescription = stringResource(R.string.woopos_battery_low), tint = WooPosTheme.colors.alert, - modifier = Modifier.size(16.dp) + modifier = Modifier.size(20.dp) ) } WooPosHomeFloatingToolbarState.BatteryState.CRITICAL -> { - Spacer(modifier = Modifier.width(WooPosSpacing.XSmall.value)) Icon( imageVector = ImageVector.vectorResource(R.drawable.ic_woo_pos_battery_critical), contentDescription = stringResource(R.string.woopos_battery_critical), tint = MaterialTheme.colorScheme.error, - modifier = Modifier.size(16.dp) + modifier = Modifier.size(20.dp) ) } }