Merge "Replaced Airplane Mode QS Icon with animations" into tm-qpr-dev am: f7e1bfab4f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19181524 Change-Id: I064e2711a4fef91ae42ce2f0692ab14b8a3eb28d Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
53
packages/SystemUI/res/drawable/qs_airplane_icon_off.xml
Normal file
53
packages/SystemUI/res/drawable/qs_airplane_icon_off.xml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt">
|
||||||
|
<target android:name="time_group">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set android:ordering="together">
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="183"
|
||||||
|
android:propertyName="translateX"
|
||||||
|
android:startOffset="0"
|
||||||
|
android:valueFrom="0"
|
||||||
|
android:valueTo="1"
|
||||||
|
android:valueType="floatType" />
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
<aapt:attr name="android:drawable">
|
||||||
|
<vector
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<group android:name="_R_G">
|
||||||
|
<group
|
||||||
|
android:name="_R_G_L_0_G"
|
||||||
|
android:translateX="12"
|
||||||
|
android:translateY="12">
|
||||||
|
<path
|
||||||
|
android:name="_R_G_L_0_G_D_0_P_0"
|
||||||
|
android:fillAlpha="1"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData=" M-1.5 -3.02 C-1.5,-3.02 -1.5,-8.5 -1.5,-8.5 C-1.5,-9.33 -0.83,-10 0,-10 C0.83,-10 1.5,-9.33 1.5,-8.5 C1.5,-8.5 1.5,-3 1.5,-3 C1.5,-3 10,2 10,2 C10,2 10,4 10,4 C10,4 1.51,1.49 1.51,1.49 C1.51,1.49 -1.5,-3.02 -1.5,-3.02c M1.5 1.5 C1.5,1.5 -1.5,-3 -1.5,-3 C-1.5,-3 -10,2 -10,2 C-10,2 -10,4 -10,4 C-10,4 -1.5,1.5 -1.5,1.5 C-1.5,1.5 -1.5,7 -1.5,7 C-1.5,7 -4,8.5 -4,8.5 C-4,8.5 -4,10 -4,10 C-4,10 0,9 0,9 C0,9 4,10 4,10 C4,10 4,8.5 4,8.5 C4,8.5 1.5,7 1.5,7 C1.5,7 1.5,1.5 1.5,1.5c " />
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group android:name="time_group" />
|
||||||
|
</vector>
|
||||||
|
</aapt:attr>
|
||||||
|
</animated-vector>
|
||||||
98
packages/SystemUI/res/drawable/qs_airplane_icon_on.xml
Normal file
98
packages/SystemUI/res/drawable/qs_airplane_icon_on.xml
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt">
|
||||||
|
<target android:name="_R_G_L_1_G">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set android:ordering="together">
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="667"
|
||||||
|
android:pathData="M 12.125,34.75C 12.104,30.958 12.021,15.792 12,12"
|
||||||
|
android:propertyName="translateXY"
|
||||||
|
android:propertyXName="translateX"
|
||||||
|
android:propertyYName="translateY"
|
||||||
|
android:startOffset="0">
|
||||||
|
<aapt:attr name="android:interpolator">
|
||||||
|
<pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.1,1 1.0,1.0" />
|
||||||
|
</aapt:attr>
|
||||||
|
</objectAnimator>
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
<target android:name="_R_G_L_0_G">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set android:ordering="together">
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="517"
|
||||||
|
android:pathData="M 12,12C 12.021,8.312 12.104,-6.436999999999999 12.125,-10.125"
|
||||||
|
android:propertyName="translateXY"
|
||||||
|
android:propertyXName="translateX"
|
||||||
|
android:propertyYName="translateY"
|
||||||
|
android:startOffset="0">
|
||||||
|
<aapt:attr name="android:interpolator">
|
||||||
|
<pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.1,1 1.0,1.0" />
|
||||||
|
</aapt:attr>
|
||||||
|
</objectAnimator>
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
<target android:name="time_group">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set android:ordering="together">
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="683"
|
||||||
|
android:propertyName="translateX"
|
||||||
|
android:startOffset="0"
|
||||||
|
android:valueFrom="0"
|
||||||
|
android:valueTo="1"
|
||||||
|
android:valueType="floatType" />
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
<aapt:attr name="android:drawable">
|
||||||
|
<vector
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<group android:name="_R_G">
|
||||||
|
<group
|
||||||
|
android:name="_R_G_L_1_G"
|
||||||
|
android:translateX="12.125"
|
||||||
|
android:translateY="34.75">
|
||||||
|
<path
|
||||||
|
android:name="_R_G_L_1_G_D_0_P_0"
|
||||||
|
android:fillAlpha="1"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData=" M10 4 C10,4 10,2 10,2 C10,2 1.5,-3 1.5,-3 C1.5,-3 1.5,-8.5 1.5,-8.5 C1.5,-9.33 0.83,-10 0,-10 C-0.83,-10 -1.5,-9.33 -1.5,-8.5 C-1.5,-8.5 -1.5,-3 -1.5,-3 C-1.5,-3 -10,2 -10,2 C-10,2 -10,4 -10,4 C-10,4 -1.5,1.5 -1.5,1.5 C-1.5,1.5 -1.5,7 -1.5,7 C-1.5,7 -4,8.5 -4,8.5 C-4,8.5 -4,10 -4,10 C-4,10 0,9 0,9 C0,9 4,10 4,10 C4,10 4,8.5 4,8.5 C4,8.5 1.5,7 1.5,7 C1.5,7 1.5,1.5 1.5,1.5 C1.5,1.5 10,4 10,4c " />
|
||||||
|
</group>
|
||||||
|
<group
|
||||||
|
android:name="_R_G_L_0_G"
|
||||||
|
android:translateX="12"
|
||||||
|
android:translateY="12">
|
||||||
|
<path
|
||||||
|
android:name="_R_G_L_0_G_D_0_P_0"
|
||||||
|
android:fillAlpha="1"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData=" M-1.5 -3.02 C-1.5,-3.02 -1.5,-8.5 -1.5,-8.5 C-1.5,-9.33 -0.83,-10 0,-10 C0.83,-10 1.5,-9.33 1.5,-8.5 C1.5,-8.5 1.5,-3 1.5,-3 C1.5,-3 10,2 10,2 C10,2 10,4 10,4 C10,4 1.51,1.49 1.51,1.49 C1.51,1.49 -1.5,-3.02 -1.5,-3.02c M1.5 1.5 C1.5,1.5 -1.5,-3 -1.5,-3 C-1.5,-3 -10,2 -10,2 C-10,2 -10,4 -10,4 C-10,4 -1.5,1.5 -1.5,1.5 C-1.5,1.5 -1.5,7 -1.5,7 C-1.5,7 -4,8.5 -4,8.5 C-4,8.5 -4,10 -4,10 C-4,10 0,9 0,9 C0,9 4,10 4,10 C4,10 4,8.5 4,8.5 C4,8.5 1.5,7 1.5,7 C1.5,7 1.5,1.5 1.5,1.5c " />
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group android:name="time_group" />
|
||||||
|
</vector>
|
||||||
|
</aapt:attr>
|
||||||
|
</animated-vector>
|
||||||
@@ -56,7 +56,6 @@ import dagger.Lazy;
|
|||||||
|
|
||||||
/** Quick settings tile: Airplane mode **/
|
/** Quick settings tile: Airplane mode **/
|
||||||
public class AirplaneModeTile extends QSTileImpl<BooleanState> {
|
public class AirplaneModeTile extends QSTileImpl<BooleanState> {
|
||||||
private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_airplane);
|
|
||||||
private final SettingObserver mSetting;
|
private final SettingObserver mSetting;
|
||||||
private final BroadcastDispatcher mBroadcastDispatcher;
|
private final BroadcastDispatcher mBroadcastDispatcher;
|
||||||
private final Lazy<ConnectivityManager> mLazyConnectivityManager;
|
private final Lazy<ConnectivityManager> mLazyConnectivityManager;
|
||||||
@@ -129,11 +128,8 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> {
|
|||||||
final boolean airplaneMode = value != 0;
|
final boolean airplaneMode = value != 0;
|
||||||
state.value = airplaneMode;
|
state.value = airplaneMode;
|
||||||
state.label = mContext.getString(R.string.airplane_mode);
|
state.label = mContext.getString(R.string.airplane_mode);
|
||||||
state.icon = mIcon;
|
state.icon = ResourceIcon.get(state.value
|
||||||
if (state.slash == null) {
|
? R.drawable.qs_airplane_icon_on : R.drawable.qs_airplane_icon_off);
|
||||||
state.slash = new SlashState();
|
|
||||||
}
|
|
||||||
state.slash.isSlashed = !airplaneMode;
|
|
||||||
state.state = airplaneMode ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
|
state.state = airplaneMode ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
|
||||||
state.contentDescription = state.label;
|
state.contentDescription = state.label;
|
||||||
state.expandedAccessibilityClassName = Switch.class.getName();
|
state.expandedAccessibilityClassName = Switch.class.getName();
|
||||||
|
|||||||
@@ -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<ConnectivityManager>
|
||||||
|
@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))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user