From 31a3dcd28dcaf4b933188d1264fba8a17afebe4b Mon Sep 17 00:00:00 2001 From: Rasheed Lewis Date: Wed, 6 Jul 2022 02:31:17 +0000 Subject: [PATCH] Replaced Airplane Mode QS Icon with animations Fixes: 238024280 Test: atest AirplaneModeTileTest Change-Id: If6ef239fbfc3e69d918453d0ce7f59b6c11d9c87 --- .../res/drawable/qs_airplane_icon_off.xml | 53 +++++++++ .../res/drawable/qs_airplane_icon_on.xml | 98 +++++++++++++++ .../systemui/qs/tiles/AirplaneModeTile.java | 8 +- .../systemui/qs/tiles/AirplaneModeTileTest.kt | 112 ++++++++++++++++++ 4 files changed, 265 insertions(+), 6 deletions(-) create mode 100644 packages/SystemUI/res/drawable/qs_airplane_icon_off.xml create mode 100644 packages/SystemUI/res/drawable/qs_airplane_icon_on.xml create mode 100644 packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt diff --git a/packages/SystemUI/res/drawable/qs_airplane_icon_off.xml b/packages/SystemUI/res/drawable/qs_airplane_icon_off.xml new file mode 100644 index 0000000000000..f239a8dd42918 --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_airplane_icon_off.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/qs_airplane_icon_on.xml b/packages/SystemUI/res/drawable/qs_airplane_icon_on.xml new file mode 100644 index 0000000000000..d46fafa258164 --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_airplane_icon_on.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index ccec80db3ea58..86d4fa3002fc6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -56,7 +56,6 @@ import dagger.Lazy; /** Quick settings tile: Airplane mode **/ public class AirplaneModeTile extends QSTileImpl { - private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_airplane); private final SettingObserver mSetting; private final BroadcastDispatcher mBroadcastDispatcher; private final Lazy mLazyConnectivityManager; @@ -129,11 +128,8 @@ public class AirplaneModeTile extends QSTileImpl { final boolean airplaneMode = value != 0; state.value = airplaneMode; state.label = mContext.getString(R.string.airplane_mode); - state.icon = mIcon; - if (state.slash == null) { - state.slash = new SlashState(); - } - state.slash.isSlashed = !airplaneMode; + state.icon = ResourceIcon.get(state.value + ? R.drawable.qs_airplane_icon_on : R.drawable.qs_airplane_icon_off); state.state = airplaneMode ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; state.contentDescription = state.label; state.expandedAccessibilityClassName = Switch.class.getName(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt new file mode 100644 index 0000000000000..73a0cbc5054de --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AirplaneModeTileTest.kt @@ -0,0 +1,112 @@ +/* + * 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.net.ConnectivityManager +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.UiEventLogger +import com.android.internal.logging.testing.UiEventLoggerFake +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.broadcast.BroadcastDispatcher +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.QSHost +import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.qs.tileimpl.QSTileImpl +import com.android.systemui.util.settings.GlobalSettings +import com.google.common.truth.Truth.assertThat +import dagger.Lazy +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 AirplaneModeTileTest : SysuiTestCase() { + @Mock + private lateinit var mHost: QSHost + @Mock + private lateinit var mMetricsLogger: MetricsLogger + @Mock + private lateinit var mStatusBarStateController: StatusBarStateController + @Mock + private lateinit var mActivityStarter: ActivityStarter + @Mock + private lateinit var mQsLogger: QSLogger + @Mock + private lateinit var mBroadcastDispatcher: BroadcastDispatcher + @Mock + private lateinit var mConnectivityManager: Lazy + @Mock + private lateinit var mGlobalSettings: GlobalSettings + private lateinit var mTestableLooper: TestableLooper + private lateinit var mTile: AirplaneModeTile + + private val mUiEventLogger: UiEventLogger = UiEventLoggerFake() + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + mTestableLooper = TestableLooper.get(this) + Mockito.`when`(mHost.context).thenReturn(mContext) + Mockito.`when`(mHost.uiEventLogger).thenReturn(mUiEventLogger) + Mockito.`when`(mHost.userContext).thenReturn(mContext) + + mTile = AirplaneModeTile(mHost, + mTestableLooper.looper, + Handler(mTestableLooper.looper), + FalsingManagerFake(), + mMetricsLogger, + mStatusBarStateController, + mActivityStarter, + mQsLogger, + mBroadcastDispatcher, + mConnectivityManager, + mGlobalSettings) + } + + @Test + fun testIcon_whenDisabled_showsOffState() { + val state = QSTile.BooleanState() + + mTile.handleUpdateState(state, 0) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_airplane_icon_off)) + } + + @Test + fun testIcon_whenEnabled_showsOnState() { + val state = QSTile.BooleanState() + + mTile.handleUpdateState(state, 1) + + assertThat(state.icon) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_airplane_icon_on)) + } +}