From 9e5ed96062d245350d4a1d8a3e271f32175f2994 Mon Sep 17 00:00:00 2001 From: Rasheed Lewis Date: Mon, 12 Sep 2022 15:35:32 +0000 Subject: [PATCH] New QS Flashlight Tile Animated Icons Fixes: 245549760 Test: atest FlashlightTileTest Change-Id: I7f6c9efe904fa217c08242e0fa8019875a40fdf5 --- .../res/drawable/qs_flashlight_icon_off.xml | 84 ++++++++++++++ .../res/drawable/qs_flashlight_icon_on.xml | 84 ++++++++++++++ .../systemui/qs/tiles/FlashlightTile.java | 15 +-- .../systemui/qs/tiles/FlashlightTileTest.kt | 108 ++++++++++++++++++ 4 files changed, 282 insertions(+), 9 deletions(-) create mode 100644 packages/SystemUI/res/drawable/qs_flashlight_icon_off.xml create mode 100644 packages/SystemUI/res/drawable/qs_flashlight_icon_on.xml create mode 100644 packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt diff --git a/packages/SystemUI/res/drawable/qs_flashlight_icon_off.xml b/packages/SystemUI/res/drawable/qs_flashlight_icon_off.xml new file mode 100644 index 0000000000000..157e67a6e8e2b --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_flashlight_icon_off.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/qs_flashlight_icon_on.xml b/packages/SystemUI/res/drawable/qs_flashlight_icon_on.xml new file mode 100644 index 0000000000000..22f5e00dad69d --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_flashlight_icon_on.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java index 73b0896b06a50..a747926872899 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java @@ -43,11 +43,12 @@ import com.android.systemui.statusbar.policy.FlashlightController; import javax.inject.Inject; -/** Quick settings tile: Control flashlight **/ +/** + * Quick settings tile: Control flashlight + **/ public class FlashlightTile extends QSTileImpl implements FlashlightController.FlashlightListener { - private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_flashlight); private final FlashlightController mFlashlightController; @Inject @@ -116,19 +117,15 @@ public class FlashlightTile extends QSTileImpl implements @Override protected void handleUpdateState(BooleanState state, Object arg) { - if (state.slash == null) { - state.slash = new SlashState(); - } state.label = mHost.getContext().getString(R.string.quick_settings_flashlight_label); state.secondaryLabel = ""; state.stateDescription = ""; if (!mFlashlightController.isAvailable()) { - state.icon = mIcon; - state.slash.isSlashed = true; state.secondaryLabel = mContext.getString( R.string.quick_settings_flashlight_camera_in_use); state.stateDescription = state.secondaryLabel; state.state = Tile.STATE_UNAVAILABLE; + state.icon = ResourceIcon.get(R.drawable.qs_flashlight_icon_off); return; } if (arg instanceof Boolean) { @@ -140,11 +137,11 @@ public class FlashlightTile extends QSTileImpl implements } else { state.value = mFlashlightController.isEnabled(); } - state.icon = mIcon; - state.slash.isSlashed = !state.value; state.contentDescription = mContext.getString(R.string.quick_settings_flashlight_label); state.expandedAccessibilityClassName = Switch.class.getName(); state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; + state.icon = ResourceIcon.get(state.value + ? R.drawable.qs_flashlight_icon_on : R.drawable.qs_flashlight_icon_off); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt new file mode 100644 index 0000000000000..d0f851bded75c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt @@ -0,0 +1,108 @@ +package com.android.systemui.qs.tiles + +import android.content.Context +import android.os.Handler +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import androidx.test.filters.SmallTest +import com.android.internal.logging.MetricsLogger +import com.android.internal.logging.testing.UiEventLoggerFake +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.classifier.FalsingManagerFake +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.plugins.qs.QSTile +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.qs.tileimpl.QSTileImpl +import com.android.systemui.statusbar.policy.FlashlightController +import com.google.common.truth.Truth +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +@SmallTest +class FlashlightTileTest : SysuiTestCase() { + + @Mock private lateinit var mockContext: Context + + @Mock private lateinit var qsLogger: QSLogger + + @Mock private lateinit var qsHost: QSTileHost + + @Mock private lateinit var metricsLogger: MetricsLogger + + @Mock private lateinit var statusBarStateController: StatusBarStateController + + @Mock private lateinit var activityStarter: ActivityStarter + + @Mock private lateinit var flashlightController: FlashlightController + + private val uiEventLogger = UiEventLoggerFake() + private val falsingManager = FalsingManagerFake() + private lateinit var testableLooper: TestableLooper + private lateinit var tile: FlashlightTile + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + testableLooper = TestableLooper.get(this) + + Mockito.`when`(qsHost.context).thenReturn(mockContext) + Mockito.`when`(qsHost.uiEventLogger).thenReturn(uiEventLogger) + + tile = + FlashlightTile( + qsHost, + testableLooper.looper, + Handler(testableLooper.looper), + falsingManager, + metricsLogger, + statusBarStateController, + activityStarter, + qsLogger, + flashlightController + ) + } + + @Test + fun testIcon_whenFlashlightEnabled_isOnState() { + Mockito.`when`(flashlightController.isAvailable).thenReturn(true) + Mockito.`when`(flashlightController.isEnabled).thenReturn(true) + val state = QSTile.BooleanState() + + tile.handleUpdateState(state, /* arg= */ null) + + Truth.assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_flashlight_icon_on)) + } + + @Test + fun testIcon_whenFlashlightDisabled_isOffState() { + Mockito.`when`(flashlightController.isAvailable).thenReturn(true) + Mockito.`when`(flashlightController.isEnabled).thenReturn(false) + val state = QSTile.BooleanState() + + tile.handleUpdateState(state, /* arg= */ null) + + Truth.assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_flashlight_icon_off)) + } + + @Test + fun testIcon_whenFlashlightUnavailable_isOffState() { + Mockito.`when`(flashlightController.isAvailable).thenReturn(false) + val state = QSTile.BooleanState() + + tile.handleUpdateState(state, /* arg= */ null) + + Truth.assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_flashlight_icon_off)) + } +}