diff --git a/packages/SystemUI/res-keyguard/drawable/qs_light_dark_theme_icon_off.xml b/packages/SystemUI/res-keyguard/drawable/qs_light_dark_theme_icon_off.xml new file mode 100644 index 0000000000000..5c0a7c8208871 --- /dev/null +++ b/packages/SystemUI/res-keyguard/drawable/qs_light_dark_theme_icon_off.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res-keyguard/drawable/qs_light_dark_theme_icon_on.xml b/packages/SystemUI/res-keyguard/drawable/qs_light_dark_theme_icon_on.xml new file mode 100644 index 0000000000000..a96b7480ec946 --- /dev/null +++ b/packages/SystemUI/res-keyguard/drawable/qs_light_dark_theme_icon_on.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java index e2964eaf2a23b..f60e0661a2355 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java @@ -17,6 +17,7 @@ package com.android.systemui.qs.tiles; import android.app.UiModeManager; +import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Handler; @@ -60,9 +61,7 @@ public class UiModeNightTile extends QSTileImpl implements ConfigurationController.ConfigurationListener, BatteryController.BatteryStateChangeCallback { public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a"); - private final Icon mIcon = ResourceIcon.get( - com.android.internal.R.drawable.ic_qs_ui_mode_night); - private UiModeManager mUiModeManager; + private final UiModeManager mUiModeManager; private final BatteryController mBatteryController; private final LocationController mLocationController; @Inject @@ -82,7 +81,8 @@ public class UiModeNightTile extends QSTileImpl implements super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); mBatteryController = batteryController; - mUiModeManager = host.getUserContext().getSystemService(UiModeManager.class); + mUiModeManager = (UiModeManager) host.getUserContext().getSystemService( + Context.UI_MODE_SERVICE); mLocationController = locationController; configurationController.observe(getLifecycle(), this); batteryController.observe(getLifecycle(), this); @@ -155,7 +155,6 @@ public class UiModeNightTile extends QSTileImpl implements } state.value = nightMode; state.label = mContext.getString(R.string.quick_settings_ui_mode_night_label); - state.icon = mIcon; state.contentDescription = TextUtils.isEmpty(state.secondaryLabel) ? state.label : TextUtils.concat(state.label, ", ", state.secondaryLabel); @@ -164,6 +163,9 @@ public class UiModeNightTile extends QSTileImpl implements } else { state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; } + state.icon = ResourceIcon.get(state.state == Tile.STATE_ACTIVE + ? R.drawable.qs_light_dark_theme_icon_on + : R.drawable.qs_light_dark_theme_icon_off); state.showRippleEffect = false; state.expandedAccessibilityClassName = Switch.class.getName(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt new file mode 100644 index 0000000000000..ea70c263a1211 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.tiles + +import android.app.UiModeManager +import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources +import android.os.Handler +import android.test.suitebuilder.annotation.SmallTest +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +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.BatteryController +import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.statusbar.policy.LocationController +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +@SmallTest +class UiModeNightTileTest : SysuiTestCase() { + + @Mock + private lateinit var mockContext: Context + @Mock + private lateinit var uiModeManager: UiModeManager + @Mock + private lateinit var resources: Resources + @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 configurationController: ConfigurationController + @Mock + private lateinit var batteryController: BatteryController + @Mock + private lateinit var locationController: LocationController + + private val uiEventLogger = UiEventLoggerFake() + private val falsingManager = FalsingManagerFake() + private lateinit var testableLooper: TestableLooper + private lateinit var tile: UiModeNightTile + private lateinit var configuration: Configuration + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + testableLooper = TestableLooper.get(this) + configuration = Configuration() + mContext.addMockSystemService(Context.UI_MODE_SERVICE, uiModeManager) + + `when`(qsHost.context).thenReturn(mockContext) + `when`(qsHost.userContext).thenReturn(mContext) + `when`(mockContext.resources).thenReturn(resources) + `when`(resources.configuration).thenReturn(configuration) + `when`(qsHost.uiEventLogger).thenReturn(uiEventLogger) + + tile = UiModeNightTile( + qsHost, + testableLooper.looper, + Handler(testableLooper.looper), + falsingManager, + metricsLogger, + statusBarStateController, + activityStarter, + qsLogger, + configurationController, + batteryController, + locationController) + } + + @Test + fun testIcon_whenNightModeOn_isOnState() { + val state = QSTile.BooleanState() + setNightModeOn() + + tile.handleUpdateState(state, /* arg= */ null) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_light_dark_theme_icon_on)) + } + + @Test + fun testIcon_whenNightModeOn_isOffState() { + val state = QSTile.BooleanState() + setNightModeOff() + + tile.handleUpdateState(state, /* arg= */ null) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_light_dark_theme_icon_off)) + } + + private fun setNightModeOn() { + `when`(uiModeManager.nightMode).thenReturn(UiModeManager.MODE_NIGHT_YES) + configuration.uiMode = Configuration.UI_MODE_NIGHT_YES + } + + private fun setNightModeOff() { + `when`(uiModeManager.nightMode).thenReturn(UiModeManager.MODE_NIGHT_NO) + configuration.uiMode = Configuration.UI_MODE_NIGHT_NO + } +}