LockIcon fixes

Gather state inisitally, then consolidate it on a pre-draw listener.
Before we were deciding when to change the icon based on various
variables, now I'm centralizing the decision on getState(), to avoid
cancelling animations.

Test: At AOD2, lock animates in
Test: When locked, press power button: lock icon animates in
Test: Press power button: lock icon animates in scanning and unlocks
Test: Unlock without bypassing, let device sleep, go to AOD2
Test: Long press padlock when it's open
Test: Look at padlock from SIM PIN screen
Test: Look at padlock when lock screen is not secure (no pin/pwd)
Fixes: 135587352
Fixes: 135960400
Change-Id: I85260b6c373d675bd6076046e33519816221157f
This commit is contained in:
Lucas Dupin
2019-06-25 19:52:26 -07:00
parent 0aa57fe073
commit ad2577e1c0
6 changed files with 100 additions and 1176 deletions

View File

@@ -1,227 +0,0 @@
<!-- Copyright (C) 2019 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">
<aapt:attr name="android:drawable">
<vector android:height="42dp" android:width="32dp" android:viewportHeight="42"
android:viewportWidth="32">
<group android:name="_R_G">
<group android:name="_R_G_L_2_G" android:translateX="1.6669999999999998"
android:translateY="11.992999999999999" android:pivotX="14.333"
android:pivotY="13" android:scaleX="0" android:scaleY="0">
<path android:name="_R_G_L_2_G_D_0_P_0" android:strokeColor="#ffffff"
android:strokeLineCap="round" android:strokeLineJoin="round"
android:strokeWidth="2" android:strokeAlpha="1"
android:pathData=" M22.33 21 C22.33,21 6.33,21 6.33,21 C5.6,21 5,20.4 5,19.67 C5,19.67 5,6.33 5,6.33 C5,5.6 5.6,5 6.33,5 C6.33,5 22.33,5 22.33,5 C23.07,5 23.67,5.6 23.67,6.33 C23.67,6.33 23.67,19.67 23.67,19.67 C23.67,20.4 23.07,21 22.33,21c "/>
</group>
<group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="1.6669999999999998"
android:translateY="11.992999999999999" android:pivotX="14.333"
android:pivotY="13" android:scaleX="0" android:scaleY="0">
<group android:name="_R_G_L_1_G" android:translateX="11.583"
android:translateY="10.257">
<path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff"
android:fillAlpha="1" android:fillType="nonZero"
android:pathData=" M2.75 0.25 C4.13,0.25 5.25,1.37 5.25,2.75 C5.25,4.13 4.13,5.25 2.75,5.25 C1.37,5.25 0.25,4.13 0.25,2.75 C0.25,1.37 1.37,0.25 2.75,0.25c "/>
</group>
</group>
<group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="1.6669999999999998"
android:translateY="11.992999999999999" android:pivotX="14.333"
android:pivotY="13" android:scaleX="0" android:scaleY="0">
<group android:name="_R_G_L_0_G_T_1" android:translateX="14.333"
android:translateY="3.172">
<group android:name="_R_G_L_0_G" android:translateX="-9.667"
android:translateY="-9.667">
<path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff"
android:strokeLineCap="round" android:strokeLineJoin="round"
android:strokeWidth="2" android:strokeAlpha="1"
android:trimPathStart="0.14" android:trimPathEnd="0.89"
android:trimPathOffset="0"
android:pathData=" M14.33 14.33 C14.33,14.33 14.33,9.67 14.33,9.67 C14.33,7.09 12.24,5 9.67,5 C7.09,5 5,7.09 5,9.67 C5,9.67 5,14.33 5,14.33 "/>
</group>
</group>
</group>
</group>
<group android:name="time_group"/>
</vector>
</aapt:attr>
<target android:name="_R_G_L_2_G">
<aapt:attr name="android:animation">
<set android:ordering="together">
<objectAnimator android:propertyName="scaleX" android:duration="233"
android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleY" android:duration="233"
android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleX" android:duration="117"
android:startOffset="233" android:valueFrom="1.02"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleY" android:duration="117"
android:startOffset="233" android:valueFrom="1.02"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_1_G_N_4_T_0">
<aapt:attr name="android:animation">
<set android:ordering="together">
<objectAnimator android:propertyName="scaleX" android:duration="233"
android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleY" android:duration="233"
android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleX" android:duration="117"
android:startOffset="233" android:valueFrom="1.02"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleY" android:duration="117"
android:startOffset="233" android:valueFrom="1.02"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_D_0_P_0">
<aapt:attr name="android:animation">
<set android:ordering="together">
<objectAnimator android:propertyName="trimPathStart" android:duration="50"
android:startOffset="0" android:valueFrom="0.14"
android:valueTo="0.14" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator
android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="trimPathStart" android:duration="67"
android:startOffset="50" android:valueFrom="0.14"
android:valueTo="0" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator
android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_D_0_P_0">
<aapt:attr name="android:animation">
<set android:ordering="together">
<objectAnimator android:propertyName="trimPathEnd" android:duration="50"
android:startOffset="0" android:valueFrom="0.89"
android:valueTo="0.89" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator
android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="trimPathEnd" android:duration="67"
android:startOffset="50" android:valueFrom="0.89"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator
android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_T_1">
<aapt:attr name="android:animation">
<set android:ordering="together">
<objectAnimator android:propertyName="translateY" android:duration="150"
android:startOffset="0" android:valueFrom="3.172"
android:valueTo="0.34" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.23,-0.46 0.2,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_N_4_T_0">
<aapt:attr name="android:animation">
<set android:ordering="together">
<objectAnimator android:propertyName="scaleX" android:duration="233"
android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleY" android:duration="233"
android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleX" android:duration="117"
android:startOffset="233" android:valueFrom="1.02"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
<objectAnimator android:propertyName="scaleY" android:duration="117"
android:startOffset="233" android:valueFrom="1.02"
android:valueTo="1" android:valueType="floatType">
<aapt:attr name="android:interpolator">
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,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:propertyName="translateX" android:duration="717"
android:startOffset="0" android:valueFrom="0" android:valueTo="1"
android:valueType="floatType"/>
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@@ -1,327 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
xmlns:android="http://schemas.android.com/apk/res/android" >
<aapt:attr name="android:drawable" >
<vector
android:height="32dp"
android:viewportHeight="32"
android:viewportWidth="32"
android:width="32dp" >
<group android:name="_R_G" >
<group
android:name="_R_G_L_2_G"
android:pivotX="9.583"
android:pivotY="8.916"
android:scaleX="0"
android:scaleY="0"
android:translateX="6.416"
android:translateY="10.416999999999998" >
<path
android:name="_R_G_L_2_G_D_0_P_0"
android:fillAlpha="1"
android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c " />
</group>
<group
android:name="_R_G_L_1_G_N_3_T_0"
android:pivotX="9.583"
android:pivotY="8.916"
android:scaleX="0"
android:scaleY="0"
android:translateX="6.416"
android:translateY="10.416999999999998" >
<group
android:name="_R_G_L_1_G"
android:translateX="7.334"
android:translateY="5.333" >
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="1"
android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c " />
<path
android:name="_R_G_L_1_G_D_1_P_0"
android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 "
android:strokeAlpha="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.5" />
</group>
</group>
<group
android:name="_R_G_L_0_G_N_3_T_0"
android:pivotX="9.583"
android:pivotY="8.916"
android:scaleX="0"
android:scaleY="0"
android:translateX="6.416"
android:translateY="10.416999999999998" >
<group
android:name="_R_G_L_0_G_T_1"
android:translateX="9.583"
android:translateY="-0.861" >
<group
android:name="_R_G_L_0_G"
android:translateX="-8.083"
android:translateY="-8.173" >
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:pathData=" M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 "
android:strokeAlpha="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:trimPathEnd="0.9"
android:trimPathOffset="0"
android:trimPathStart="0.15" />
</group>
</group>
</group>
</group>
<group android:name="time_group" />
</vector>
</aapt:attr>
<target android:name="_R_G_L_2_G" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_1_G_N_3_T_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_D_0_P_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="50"
android:propertyName="trimPathStart"
android:startOffset="0"
android:valueFrom="0.15"
android:valueTo="0.15"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="67"
android:propertyName="trimPathStart"
android:startOffset="50"
android:valueFrom="0.15"
android:valueTo="0"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_D_0_P_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="50"
android:propertyName="trimPathEnd"
android:startOffset="0"
android:valueFrom="0.9"
android:valueTo="0.9"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="67"
android:propertyName="trimPathEnd"
android:startOffset="50"
android:valueFrom="0.9"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_T_1" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="150"
android:pathData="M 9.583,-0.861C 9.583,-1.32784640645981 9.583,-3.19515359354019 9.583,-3.662"
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.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_N_3_T_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,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="717"
android:propertyName="translateX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@@ -1,190 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
xmlns:android="http://schemas.android.com/apk/res/android" >
<aapt:attr name="android:drawable" >
<vector
android:height="32dp"
android:viewportHeight="32"
android:viewportWidth="32"
android:width="32dp" >
<group android:name="_R_G" >
<group
android:name="_R_G_L_1_G"
android:pivotX="10.917"
android:pivotY="9.583"
android:scaleX="0"
android:scaleY="0"
android:translateX="5.083"
android:translateY="10.417" >
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="1"
android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " />
</group>
<group
android:name="_R_G_L_0_G_N_2_T_0"
android:pivotX="10.917"
android:pivotY="9.583"
android:scaleX="0"
android:scaleY="0"
android:translateX="5.083"
android:translateY="10.417" >
<group
android:name="_R_G_L_0_G_T_1"
android:translateX="10.917"
android:translateY="0.579" >
<group
android:name="_R_G_L_0_G"
android:translateX="-9"
android:translateY="-9" >
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:pathData=" M13 13 C13,13 13,9 13,9 C13,6.79 11.21,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 "
android:strokeAlpha="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="2" />
</group>
</group>
</group>
</group>
<group android:name="time_group" />
</vector>
</aapt:attr>
<target android:name="_R_G_L_1_G" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_T_1" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="150"
android:pathData="M 10.917,0.579C 10.917,-0.14248990631104008 10.917,-3.02851009368896 10.917,-3.75"
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.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_N_2_T_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,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="717"
android:propertyName="translateX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@@ -1,336 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
xmlns:android="http://schemas.android.com/apk/res/android" >
<aapt:attr name="android:drawable" >
<vector
android:height="38dp"
android:viewportHeight="38"
android:viewportWidth="32"
android:width="32dp" >
<group android:name="_R_G" >
<group
android:name="_R_G_L_2_G"
android:pivotX="14.667"
android:pivotY="12.667"
android:scaleX="0"
android:scaleY="0"
android:translateX="1.3330000000000002"
android:translateY="10.333" >
<path
android:name="_R_G_L_2_G_D_0_P_0"
android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c "
android:strokeAlpha="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.5" />
</group>
<group
android:name="_R_G_L_1_G_N_3_T_0"
android:pivotX="14.667"
android:pivotY="12.667"
android:scaleX="0"
android:scaleY="0"
android:translateX="1.3330000000000002"
android:translateY="10.333" >
<group
android:name="_R_G_L_1_G"
android:translateX="12.416"
android:translateY="10.417" >
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="1"
android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " />
</group>
</group>
<group android:name="_R_G_L_0_G_N_3_T_0_M" >
<group
android:name="_R_G_L_0_G_N_3_T_0"
android:pivotX="14.667"
android:pivotY="12.667"
android:scaleX="0"
android:scaleY="0"
android:translateX="1.3330000000000002"
android:translateY="10.333" >
<group
android:name="_R_G_L_0_G_T_1"
android:translateX="14.666"
android:translateY="3.769" >
<group
android:name="_R_G_L_0_G"
android:translateX="-9.333"
android:translateY="-9.713" >
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 "
android:strokeAlpha="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:trimPathEnd="0.9"
android:trimPathOffset="0"
android:trimPathStart="0.14" />
</group>
</group>
</group>
</group>
</group>
<group android:name="time_group" />
</vector>
</aapt:attr>
<target android:name="_R_G_L_2_G" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_1_G_N_3_T_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_D_0_P_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="50"
android:propertyName="trimPathStart"
android:startOffset="0"
android:valueFrom="0.14"
android:valueTo="0.14"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="67"
android:propertyName="trimPathStart"
android:startOffset="50"
android:valueFrom="0.14"
android:valueTo="0"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_D_0_P_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="50"
android:propertyName="trimPathEnd"
android:startOffset="0"
android:valueFrom="0.9"
android:valueTo="0.9"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="67"
android:propertyName="trimPathEnd"
android:startOffset="50"
android:valueFrom="0.9"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_T_1" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="150"
android:pathData="M 14.666,3.769C 14.666,3.18868762874603 14.666,0.8673123712539699 14.666,0.287"
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.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_N_3_T_0" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="233"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="233"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1.025"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleX"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
<objectAnimator
android:duration="117"
android:propertyName="scaleY"
android:startOffset="233"
android:valueFrom="1.025"
android:valueTo="1"
android:valueType="floatType" >
<aapt:attr name="android:interpolator" >
<pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
<target android:name="_R_G_L_0_G_N_3_T_0_M" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="0"
android:propertyName="scaleX"
android:startOffset="50"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>
</aapt:attr>
</target>
<target android:name="time_group" >
<aapt:attr name="android:animation" >
<set android:ordering="together" >
<objectAnimator
android:duration="717"
android:propertyName="translateX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.phone;
import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
import android.annotation.IntDef;
@@ -29,12 +28,12 @@ import android.graphics.drawable.Animatable2;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricSourceType;
import android.os.Handler;
import android.os.Trace;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo;
import androidx.annotation.Nullable;
@@ -43,6 +42,7 @@ import com.android.internal.graphics.ColorUtils;
import com.android.internal.telephony.IccCardConstants;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -67,7 +67,7 @@ import javax.inject.Named;
public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener,
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
UnlockMethodCache.OnUnlockMethodChangedListener,
NotificationWakeUpCoordinator.WakeUpListener {
NotificationWakeUpCoordinator.WakeUpListener, ViewTreeObserver.OnPreDrawListener {
private static final int STATE_LOCKED = 0;
private static final int STATE_LOCK_OPEN = 1;
@@ -79,12 +79,12 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final AccessibilityController mAccessibilityController;
private final DockManager mDockManager;
private final Handler mMainHandler;
private final KeyguardMonitor mKeyguardMonitor;
private final KeyguardBypassController mBypassController;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
private int mLastState = 0;
private boolean mForceUpdate;
private boolean mTransientBiometricsError;
private boolean mIsFaceUnlockState;
private boolean mSimLocked;
@@ -92,23 +92,20 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private boolean mPulsing;
private boolean mDozing;
private boolean mDocked;
private boolean mLastDozing;
private boolean mLastPulsing;
private int mIconColor;
private float mDozeAmount;
private int mIconRes;
private boolean mBouncerShowing;
private boolean mWasPulsingOnThisFrame;
private boolean mWakeAndUnlockRunning;
private boolean mKeyguardShowing;
private boolean mShowingLaunchAffordance;
private boolean mUpdatePending;
private final KeyguardMonitor.Callback mKeyguardMonitorCallback =
new KeyguardMonitor.Callback() {
@Override
public void onKeyguardShowingChanged() {
mKeyguardShowing = mKeyguardMonitor.isShowing();
update(false /* force */);
update();
}
};
private final DockManager.DockEventListener mDockEventListener =
@@ -119,7 +116,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
|| event == DockManager.STATE_DOCKED_HIDE;
if (docked != mDocked) {
mDocked = docked;
update(true /* force */);
update();
}
}
};
@@ -129,9 +126,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
@Override
public void onSimStateChanged(int subId, int slotId,
IccCardConstants.State simState) {
boolean oldSimLocked = mSimLocked;
mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure();
update(oldSimLocked != mSimLocked);
update();
}
@Override
@@ -149,11 +145,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
public void onStrongAuthStateChanged(int userId) {
update();
}
@Override
public void onBiometricsCleared() {
update();
}
};
@Inject
@@ -164,8 +155,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardMonitor keyguardMonitor,
@Nullable DockManager dockManager,
@Named(MAIN_HANDLER_NAME) Handler mainHandler) {
@Nullable DockManager dockManager) {
super(context, attrs);
mContext = context;
mUnlockMethodCache = UnlockMethodCache.getInstance(context);
@@ -177,7 +167,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
mWakeUpCoordinator = wakeUpCoordinator;
mKeyguardMonitor = keyguardMonitor;
mDockManager = dockManager;
mMainHandler = mainHandler;
}
@Override
@@ -194,6 +183,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
mDockManager.addListener(mDockEventListener);
}
onThemeChanged();
update();
}
@Override
@@ -247,51 +237,61 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
}
public void update(boolean force) {
int state = getState();
mIsFaceUnlockState = state == STATE_SCANNING_FACE;
if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing || force) {
@LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(mLastState,
state, mLastPulsing, mPulsing, mLastDozing, mDozing);
boolean isAnim = lockAnimIndex != -1;
int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state);
if (iconRes != mIconRes) {
mIconRes = iconRes;
Drawable icon = mContext.getDrawable(iconRes);
final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
? (AnimatedVectorDrawable) icon
: null;
setImageDrawable(icon, false);
if (mIsFaceUnlockState) {
announceForAccessibility(getContext().getString(
R.string.accessibility_scanning_face));
}
if (animation != null && isAnim) {
animation.forceAnimationOnUI();
animation.clearAnimationCallbacks();
animation.registerAnimationCallback(new Animatable2.AnimationCallback() {
@Override
public void onAnimationEnd(Drawable drawable) {
if (getDrawable() == animation && state == getState()
&& doesAnimationLoop(lockAnimIndex)) {
animation.start();
} else {
Trace.endAsyncSection("LockIcon#Animation", state);
}
}
});
Trace.beginAsyncSection("LockIcon#Animation", state);
animation.start();
}
}
updateDarkTint();
mLastState = state;
mLastDozing = mDozing;
mLastPulsing = mPulsing;
if (force) {
mForceUpdate = true;
}
if (!mUpdatePending) {
mUpdatePending = true;
getViewTreeObserver().addOnPreDrawListener(this);
}
}
@Override
public boolean onPreDraw() {
mUpdatePending = false;
getViewTreeObserver().removeOnPreDrawListener(this);
int state = getState();
int lastState = mLastState;
mIsFaceUnlockState = state == STATE_SCANNING_FACE;
mLastState = state;
if (lastState != state || mForceUpdate) {
mForceUpdate = false;
@LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(lastState,
state, mPulsing, mDozing);
boolean isAnim = lockAnimIndex != -1;
int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state);
Drawable icon = mContext.getDrawable(iconRes);
final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
? (AnimatedVectorDrawable) icon
: null;
setImageDrawable(icon, false);
if (mIsFaceUnlockState) {
announceForAccessibility(getContext().getString(
R.string.accessibility_scanning_face));
}
if (animation != null && isAnim) {
animation.forceAnimationOnUI();
animation.clearAnimationCallbacks();
animation.registerAnimationCallback(new Animatable2.AnimationCallback() {
@Override
public void onAnimationEnd(Drawable drawable) {
if (getDrawable() == animation && state == getState()
&& doesAnimationLoop(lockAnimIndex)) {
animation.start();
} else {
Trace.endAsyncSection("LockIcon#Animation", state);
}
}
});
Trace.beginAsyncSection("LockIcon#Animation", state);
animation.start();
}
}
updateDarkTint();
boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked);
boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning
@@ -302,8 +302,25 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
&& !mBouncerShowing) {
invisible = true;
}
setVisibility(invisible ? INVISIBLE : VISIBLE);
boolean wasInvisible = getVisibility() == INVISIBLE;
if (invisible != wasInvisible) {
setVisibility(invisible ? INVISIBLE : VISIBLE);
animate().cancel();
if (!invisible) {
setScaleX(0);
setScaleY(0);
animate()
.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN)
.scaleX(1)
.scaleY(1)
.withLayer()
.setDuration(233)
.start();
}
}
updateClickability();
return true;
}
private void updateClickability() {
@@ -364,30 +381,22 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
return lockAnimIndex == SCANNING;
}
private int getAnimationIndexForTransition(int oldState, int newState,
boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing) {
private static int getAnimationIndexForTransition(int oldState, int newState, boolean pulsing,
boolean dozing) {
// Never animate when screen is off
if (dozing && !pulsing && !mWasPulsingOnThisFrame) {
if (dozing && !pulsing) {
return -1;
}
boolean isError = oldState != STATE_BIOMETRICS_ERROR && newState == STATE_BIOMETRICS_ERROR;
boolean justUnlocked = oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN;
boolean justLocked = oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED;
boolean nowPulsing = !wasPulsing && pulsing;
boolean turningOn = wasDozing && !dozing && !mWasPulsingOnThisFrame;
if (isError) {
if (newState == STATE_BIOMETRICS_ERROR) {
return ERROR;
} else if (justUnlocked) {
} else if (oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN) {
return UNLOCK;
} else if (justLocked) {
} else if (oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED) {
return LOCK;
} else if (newState == STATE_SCANNING_FACE) {
return SCANNING;
} else if ((nowPulsing || turningOn) && newState != STATE_LOCK_OPEN) {
return LOCK_IN;
}
return -1;
}
@@ -407,37 +416,33 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
}
@Retention(RetentionPolicy.SOURCE)
@IntDef({ERROR, UNLOCK, LOCK, SCANNING, LOCK_IN})
@IntDef({ERROR, UNLOCK, LOCK, SCANNING})
@interface LockAnimIndex {}
private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3, LOCK_IN = 4;
private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3;
private static final int[][] LOCK_ANIM_RES_IDS = new int[][] {
{
R.anim.lock_to_error,
R.anim.lock_unlock,
R.anim.lock_lock,
R.anim.lock_scanning,
R.anim.lock_in,
R.anim.lock_scanning
},
{
R.anim.lock_to_error_circular,
R.anim.lock_unlock_circular,
R.anim.lock_lock_circular,
R.anim.lock_scanning_circular,
R.anim.lock_in_circular,
R.anim.lock_scanning_circular
},
{
R.anim.lock_to_error_filled,
R.anim.lock_unlock_filled,
R.anim.lock_lock_filled,
R.anim.lock_scanning_filled,
R.anim.lock_in_filled,
R.anim.lock_scanning_filled
},
{
R.anim.lock_to_error_rounded,
R.anim.lock_unlock_rounded,
R.anim.lock_lock_rounded,
R.anim.lock_scanning_rounded,
R.anim.lock_in_rounded,
R.anim.lock_scanning_rounded
},
};
@@ -462,7 +467,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
return STATE_LOCK_OPEN;
} else if (mTransientBiometricsError) {
return STATE_BIOMETRICS_ERROR;
} else if (updateMonitor.isFaceDetectionRunning()) {
} else if (updateMonitor.isFaceDetectionRunning() && !mPulsing) {
return STATE_SCANNING_FACE;
} else {
return STATE_LOCKED;
@@ -481,12 +486,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
*/
public void setPulsing(boolean pulsing) {
mPulsing = pulsing;
if (!mPulsing) {
mWasPulsingOnThisFrame = true;
mMainHandler.post(() -> {
mWasPulsingOnThisFrame = false;
});
}
update();
}

View File

@@ -190,6 +190,11 @@ public class UnlockMethodCache {
public void onKeyguardVisibilityChanged(boolean showing) {
update(false /* updateAlways */);
}
@Override
public void onBiometricsCleared() {
update(false /* alwaysUpdate */);
}
};
public boolean isTrustManaged() {