Loading packages/SystemUI/res/values/strings.xml +5 −2 Original line number Diff line number Diff line Loading @@ -2772,6 +2772,9 @@ <!-- Text for education page content description for unfolded animation. [CHAR_LIMIT=NONE] --> <string name="rear_display_accessibility_unfolded_animation">Foldable device being flipped around</string> <!-- Title for notification of low stylus battery. [CHAR_LIMIT=NONE] --> <string name="stylus_battery_low">Stylus battery low</string> <!-- Title for notification of low stylus battery with percentage. "percentage" is the value of the battery capacity remaining [CHAR LIMIT=none]--> <string name="stylus_battery_low_percentage"><xliff:g id="percentage" example="16%">%s</xliff:g> battery remaining</string> <!-- Subtitle for the notification sent when a stylus battery is low. [CHAR LIMIT=none]--> <string name="stylus_battery_low_subtitle">Connect your stylus to a charger</string> </resources> packages/SystemUI/src/com/android/systemui/stylus/StylusUsiPowerUI.kt +4 −4 Original line number Diff line number Diff line Loading @@ -123,13 +123,13 @@ constructor( .setSmallIcon(R.drawable.ic_power_low) .setDeleteIntent(getPendingBroadcast(ACTION_DISMISSED_LOW_BATTERY)) .setContentIntent(getPendingBroadcast(ACTION_CLICKED_LOW_BATTERY)) .setContentTitle(context.getString(R.string.stylus_battery_low)) .setContentText( .setContentTitle( context.getString( R.string.battery_low_percent_format, R.string.stylus_battery_low_percentage, NumberFormat.getPercentInstance().format(batteryCapacity) ) ) .setContentText(context.getString(R.string.stylus_battery_low_subtitle)) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setLocalOnly(true) .setAutoCancel(true) Loading Loading @@ -177,7 +177,7 @@ constructor( // https://source.chromium.org/chromium/chromium/src/+/main:ash/system/power/peripheral_battery_notifier.cc;l=41 private const val LOW_BATTERY_THRESHOLD = 0.16f private val USI_NOTIFICATION_ID = R.string.stylus_battery_low private val USI_NOTIFICATION_ID = R.string.stylus_battery_low_percentage private const val ACTION_DISMISSED_LOW_BATTERY = "StylusUsiPowerUI.dismiss" private const val ACTION_CLICKED_LOW_BATTERY = "StylusUsiPowerUI.click" Loading packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerUiTest.kt +31 −12 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.stylus import android.app.Notification import android.hardware.BatteryState import android.hardware.input.InputManager import android.os.Handler Loading @@ -28,10 +29,13 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever import junit.framework.Assert.assertEquals import org.junit.Before import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.inOrder import org.mockito.Mockito.times Loading @@ -46,6 +50,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { @Mock lateinit var inputManager: InputManager @Mock lateinit var handler: Handler @Mock lateinit var btStylusDevice: InputDevice @Captor lateinit var notificationCaptor: ArgumentCaptor<Notification> private lateinit var stylusUsiPowerUi: StylusUsiPowerUI Loading @@ -70,7 +75,8 @@ class StylusUsiPowerUiTest : SysuiTestCase() { fun updateBatteryState_capacityBelowThreshold_notifies() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.1f)) verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) verifyNoMoreInteractions(notificationManager) } Loading @@ -78,7 +84,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { fun updateBatteryState_capacityAboveThreshold_cancelsNotificattion() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.8f)) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) verifyNoMoreInteractions(notificationManager) } Loading @@ -88,8 +94,9 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.8f)) inOrder(notificationManager).let { it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) it.verifyNoMoreInteractions() } } Loading @@ -99,7 +106,16 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.1f)) stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.15f)) verify(notificationManager, times(2)).notify(eq(R.string.stylus_battery_low), any()) verify(notificationManager, times(2)) .notify(eq(R.string.stylus_battery_low_percentage), notificationCaptor.capture()) assertEquals( notificationCaptor.value.extras.getString(Notification.EXTRA_TITLE), context.getString(R.string.stylus_battery_low_percentage, "15%") ) assertEquals( notificationCaptor.value.extras.getString(Notification.EXTRA_TEXT), context.getString(R.string.stylus_battery_low_subtitle) ) verifyNoMoreInteractions(notificationManager) } Loading @@ -110,9 +126,11 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.1f)) inOrder(notificationManager).let { it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verifyNoMoreInteractions() } } Loading @@ -121,7 +139,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { fun updateSuppression_noExistingNotification_cancelsNotification() { stylusUsiPowerUi.updateSuppression(true) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) verifyNoMoreInteractions(notificationManager) } Loading @@ -132,8 +150,9 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateSuppression(true) inOrder(notificationManager).let { it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) it.verifyNoMoreInteractions() } } Loading @@ -156,7 +175,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.refresh() verify(notificationManager).cancel(R.string.stylus_battery_low) verify(notificationManager).cancel(R.string.stylus_battery_low_percentage) } class FixedCapacityBatteryState(private val capacity: Float) : BatteryState() { Loading Loading
packages/SystemUI/res/values/strings.xml +5 −2 Original line number Diff line number Diff line Loading @@ -2772,6 +2772,9 @@ <!-- Text for education page content description for unfolded animation. [CHAR_LIMIT=NONE] --> <string name="rear_display_accessibility_unfolded_animation">Foldable device being flipped around</string> <!-- Title for notification of low stylus battery. [CHAR_LIMIT=NONE] --> <string name="stylus_battery_low">Stylus battery low</string> <!-- Title for notification of low stylus battery with percentage. "percentage" is the value of the battery capacity remaining [CHAR LIMIT=none]--> <string name="stylus_battery_low_percentage"><xliff:g id="percentage" example="16%">%s</xliff:g> battery remaining</string> <!-- Subtitle for the notification sent when a stylus battery is low. [CHAR LIMIT=none]--> <string name="stylus_battery_low_subtitle">Connect your stylus to a charger</string> </resources>
packages/SystemUI/src/com/android/systemui/stylus/StylusUsiPowerUI.kt +4 −4 Original line number Diff line number Diff line Loading @@ -123,13 +123,13 @@ constructor( .setSmallIcon(R.drawable.ic_power_low) .setDeleteIntent(getPendingBroadcast(ACTION_DISMISSED_LOW_BATTERY)) .setContentIntent(getPendingBroadcast(ACTION_CLICKED_LOW_BATTERY)) .setContentTitle(context.getString(R.string.stylus_battery_low)) .setContentText( .setContentTitle( context.getString( R.string.battery_low_percent_format, R.string.stylus_battery_low_percentage, NumberFormat.getPercentInstance().format(batteryCapacity) ) ) .setContentText(context.getString(R.string.stylus_battery_low_subtitle)) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setLocalOnly(true) .setAutoCancel(true) Loading Loading @@ -177,7 +177,7 @@ constructor( // https://source.chromium.org/chromium/chromium/src/+/main:ash/system/power/peripheral_battery_notifier.cc;l=41 private const val LOW_BATTERY_THRESHOLD = 0.16f private val USI_NOTIFICATION_ID = R.string.stylus_battery_low private val USI_NOTIFICATION_ID = R.string.stylus_battery_low_percentage private const val ACTION_DISMISSED_LOW_BATTERY = "StylusUsiPowerUI.dismiss" private const val ACTION_CLICKED_LOW_BATTERY = "StylusUsiPowerUI.click" Loading
packages/SystemUI/tests/src/com/android/systemui/stylus/StylusUsiPowerUiTest.kt +31 −12 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.stylus import android.app.Notification import android.hardware.BatteryState import android.hardware.input.InputManager import android.os.Handler Loading @@ -28,10 +29,13 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever import junit.framework.Assert.assertEquals import org.junit.Before import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.inOrder import org.mockito.Mockito.times Loading @@ -46,6 +50,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { @Mock lateinit var inputManager: InputManager @Mock lateinit var handler: Handler @Mock lateinit var btStylusDevice: InputDevice @Captor lateinit var notificationCaptor: ArgumentCaptor<Notification> private lateinit var stylusUsiPowerUi: StylusUsiPowerUI Loading @@ -70,7 +75,8 @@ class StylusUsiPowerUiTest : SysuiTestCase() { fun updateBatteryState_capacityBelowThreshold_notifies() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.1f)) verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) verifyNoMoreInteractions(notificationManager) } Loading @@ -78,7 +84,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { fun updateBatteryState_capacityAboveThreshold_cancelsNotificattion() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.8f)) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) verifyNoMoreInteractions(notificationManager) } Loading @@ -88,8 +94,9 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.8f)) inOrder(notificationManager).let { it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) it.verifyNoMoreInteractions() } } Loading @@ -99,7 +106,16 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.1f)) stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.15f)) verify(notificationManager, times(2)).notify(eq(R.string.stylus_battery_low), any()) verify(notificationManager, times(2)) .notify(eq(R.string.stylus_battery_low_percentage), notificationCaptor.capture()) assertEquals( notificationCaptor.value.extras.getString(Notification.EXTRA_TITLE), context.getString(R.string.stylus_battery_low_percentage, "15%") ) assertEquals( notificationCaptor.value.extras.getString(Notification.EXTRA_TEXT), context.getString(R.string.stylus_battery_low_subtitle) ) verifyNoMoreInteractions(notificationManager) } Loading @@ -110,9 +126,11 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateBatteryState(FixedCapacityBatteryState(0.1f)) inOrder(notificationManager).let { it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verifyNoMoreInteractions() } } Loading @@ -121,7 +139,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { fun updateSuppression_noExistingNotification_cancelsNotification() { stylusUsiPowerUi.updateSuppression(true) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) verifyNoMoreInteractions(notificationManager) } Loading @@ -132,8 +150,9 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.updateSuppression(true) inOrder(notificationManager).let { it.verify(notificationManager, times(1)).notify(eq(R.string.stylus_battery_low), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low) it.verify(notificationManager, times(1)) .notify(eq(R.string.stylus_battery_low_percentage), any()) it.verify(notificationManager, times(1)).cancel(R.string.stylus_battery_low_percentage) it.verifyNoMoreInteractions() } } Loading @@ -156,7 +175,7 @@ class StylusUsiPowerUiTest : SysuiTestCase() { stylusUsiPowerUi.refresh() verify(notificationManager).cancel(R.string.stylus_battery_low) verify(notificationManager).cancel(R.string.stylus_battery_low_percentage) } class FixedCapacityBatteryState(private val capacity: Float) : BatteryState() { Loading