Update udfps icon on lockscreen and AOD
Use lottie to render udfps icons on AOD and lockscreen. On AOD, this
allows us to step through a dashed pattern to decrease burn-in.
On lockscreen, we use the lottie to animate the stroke width of the
icon.
Test: manual, atest SystemUITest
Bug: 178418596
Change-Id: Ie74c460c23b4283b9c6029b29b17ec9d0dd9b09f
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index b357a94..d051290 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -94,6 +94,7 @@
"SystemUI-proto",
"dagger2",
"jsr330",
+ "lottie",
],
manifest: "AndroidManifest.xml",
diff --git a/packages/SystemUI/res/layout/udfps_keyguard_view.xml b/packages/SystemUI/res/layout/udfps_keyguard_view.xml
index 562040b..33baa4e 100644
--- a/packages/SystemUI/res/layout/udfps_keyguard_view.xml
+++ b/packages/SystemUI/res/layout/udfps_keyguard_view.xml
@@ -16,6 +16,7 @@
-->
<com.android.systemui.biometrics.UdfpsKeyguardView
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/udfps_animation_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -29,8 +30,28 @@
android:visibility="gone"/>
<!-- Fingerprint -->
- <ImageView
- android:id="@+id/udfps_keyguard_animation_fp_view"
+
+ <!-- AOD dashed fingerprint icon with moving dashes -->
+ <com.airbnb.lottie.LottieAnimationView
+ android:id="@+id/udfps_aod_fp"
android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:scaleType="centerCrop"
+ app:lottie_autoPlay="false"
+ android:padding="16dp"
+ app:lottie_loop="true"
+ app:lottie_rawRes="@raw/udfps_aod_fp"/>
+
+ <!-- LockScreen fingerprint icon from 0 stroke width to full width -->
+ <com.airbnb.lottie.LottieAnimationView
+ android:id="@+id/udfps_lockscreen_fp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:scaleType="centerCrop"
+ app:lottie_autoPlay="false"
+ app:lottie_loop="false"
+ android:padding="16dp"
+ app:lottie_rawRes="@raw/udfps_lockscreen_fp"/>
</com.android.systemui.biometrics.UdfpsKeyguardView>
diff --git a/packages/SystemUI/res/raw/udfps_aod_fp.json b/packages/SystemUI/res/raw/udfps_aod_fp.json
new file mode 100644
index 0000000..cdac332
--- /dev/null
+++ b/packages/SystemUI/res/raw/udfps_aod_fp.json
@@ -0,0 +1,2445 @@
+{
+ "v": "5.7.8",
+ "fr": 60,
+ "ip": 0,
+ "op": 361,
+ "w": 180,
+ "h": 185,
+ "nm": "fingerprint_burn_in_Loop",
+ "ddd": 0,
+ "assets": [],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 10",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -3.684,
+ 0
+ ],
+ [
+ -2.883,
+ -1.583
+ ]
+ ],
+ "o": [
+ [
+ 2.883,
+ -1.583
+ ],
+ [
+ 3.683,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -10.417,
+ 1.25
+ ],
+ [
+ 0.001,
+ -1.25
+ ],
+ [
+ 10.417,
+ 1.25
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 17,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 246
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 1326
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.999,
+ 7.5
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 5",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -3.684,
+ 0
+ ],
+ [
+ -2.883,
+ -1.583
+ ]
+ ],
+ "o": [
+ [
+ 2.883,
+ -1.583
+ ],
+ [
+ 3.683,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -10.417,
+ 1.25
+ ],
+ [
+ 0.001,
+ -1.25
+ ],
+ [
+ 10.417,
+ 1.25
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 54,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 1080
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.999,
+ 7.5
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 8",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.883,
+ 0
+ ],
+ [
+ -2.367,
+ -3.933
+ ]
+ ],
+ "o": [
+ [
+ 2.367,
+ -3.933
+ ],
+ [
+ 5.883,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -13.75,
+ 3.333
+ ],
+ [
+ 0,
+ -3.333
+ ],
+ [
+ 13.75,
+ 3.333
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 38.235,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 170
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 890
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 20,
+ 16.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 4",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.883,
+ 0
+ ],
+ [
+ -2.367,
+ -3.933
+ ]
+ ],
+ "o": [
+ [
+ 2.367,
+ -3.933
+ ],
+ [
+ 5.883,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -13.75,
+ 3.333
+ ],
+ [
+ 0,
+ -3.333
+ ],
+ [
+ 13.75,
+ 3.333
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 34.235,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 720
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 20,
+ 16.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 7",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.65,
+ 0
+ ],
+ [
+ 0,
+ -5.9
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.333,
+ 0
+ ],
+ [
+ 0.633,
+ 1.601
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.717,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ],
+ [
+ -2.15,
+ -1.716
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -0.767,
+ -2.134
+ ],
+ [
+ 0,
+ -5.917
+ ],
+ [
+ 6.65,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.333
+ ],
+ [
+ -1.734,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.634,
+ -1.599
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 2.75
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -11.108,
+ 5.825
+ ],
+ [
+ -11.875,
+ 1.525
+ ],
+ [
+ -0.208,
+ -9.175
+ ],
+ [
+ 11.875,
+ 1.525
+ ],
+ [
+ 11.875,
+ 1.592
+ ],
+ [
+ 7.659,
+ 5.808
+ ],
+ [
+ 3.742,
+ 3.158
+ ],
+ [
+ 2.526,
+ 0.141
+ ],
+ [
+ -1.391,
+ -2.508
+ ],
+ [
+ -1.641,
+ -2.508
+ ],
+ [
+ -5.625,
+ 1.475
+ ],
+ [
+ -2.225,
+ 8.558
+ ],
+ [
+ -1.458,
+ 9.175
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 35,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ -159
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 201
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.992,
+ 28.758
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 6",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.65,
+ 0
+ ],
+ [
+ 0,
+ -5.9
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.333,
+ 0
+ ],
+ [
+ 0.633,
+ 1.601
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.717,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ],
+ [
+ -2.15,
+ -1.716
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -0.767,
+ -2.134
+ ],
+ [
+ 0,
+ -5.917
+ ],
+ [
+ 6.65,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.333
+ ],
+ [
+ -1.734,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.634,
+ -1.599
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 2.75
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -11.108,
+ 5.825
+ ],
+ [
+ -11.875,
+ 1.525
+ ],
+ [
+ -0.208,
+ -9.175
+ ],
+ [
+ 11.875,
+ 1.525
+ ],
+ [
+ 11.875,
+ 1.592
+ ],
+ [
+ 7.659,
+ 5.808
+ ],
+ [
+ 3.742,
+ 3.158
+ ],
+ [
+ 2.526,
+ 0.141
+ ],
+ [
+ -1.391,
+ -2.508
+ ],
+ [
+ -1.641,
+ -2.508
+ ],
+ [
+ -5.625,
+ 1.475
+ ],
+ [
+ -2.225,
+ 8.558
+ ],
+ [
+ -1.458,
+ 9.175
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 9,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 135
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 495
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.992,
+ 28.758
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 3",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.65,
+ 0
+ ],
+ [
+ 0,
+ -5.9
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.333,
+ 0
+ ],
+ [
+ 0.633,
+ 1.601
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.717,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ],
+ [
+ -2.15,
+ -1.716
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -0.767,
+ -2.134
+ ],
+ [
+ 0,
+ -5.917
+ ],
+ [
+ 6.65,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.333
+ ],
+ [
+ -1.734,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.634,
+ -1.599
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 2.75
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -11.108,
+ 5.825
+ ],
+ [
+ -11.875,
+ 1.525
+ ],
+ [
+ -0.208,
+ -9.175
+ ],
+ [
+ 11.875,
+ 1.525
+ ],
+ [
+ 11.875,
+ 1.592
+ ],
+ [
+ 7.659,
+ 5.808
+ ],
+ [
+ 3.742,
+ 3.158
+ ],
+ [
+ 2.526,
+ 0.141
+ ],
+ [
+ -1.391,
+ -2.508
+ ],
+ [
+ -1.641,
+ -2.508
+ ],
+ [
+ -5.625,
+ 1.475
+ ],
+ [
+ -2.225,
+ 8.558
+ ],
+ [
+ -1.458,
+ 9.175
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 30,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 360
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.992,
+ 28.758
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 8,
+ "ty": 4,
+ "nm": "Layer 1 Outlines 2",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.2,
+ 0
+ ],
+ [
+ 2.217,
+ 2.066
+ ]
+ ],
+ "o": [
+ [
+ -2.217,
+ 2.066
+ ],
+ [
+ -3.2,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 8.75,
+ -1.667
+ ],
+ [
+ 0,
+ 1.667
+ ],
+ [
+ -8.75,
+ -1.667
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 69,
+ "ix": 2
+ },
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 360,
+ "s": [
+ 720
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 1,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "d": [
+ {
+ "n": "d",
+ "nm": "dash",
+ "v": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ }
+ },
+ {
+ "n": "o",
+ "nm": "offset",
+ "v": {
+ "a": 0,
+ "k": 25,
+ "ix": 7
+ }
+ }
+ ],
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 20,
+ 42.083
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": [
+ {
+ "tm": 210,
+ "cm": "2",
+ "dr": 0
+ },
+ {
+ "tm": 255,
+ "cm": "1",
+ "dr": 0
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/SystemUI/res/raw/udfps_lockscreen_fp.json b/packages/SystemUI/res/raw/udfps_lockscreen_fp.json
new file mode 100644
index 0000000..cef433e
--- /dev/null
+++ b/packages/SystemUI/res/raw/udfps_lockscreen_fp.json
@@ -0,0 +1,1017 @@
+{
+ "v": "5.7.8",
+ "fr": 60,
+ "ip": 0,
+ "op": 46,
+ "w": 180,
+ "h": 185,
+ "nm": "fingerprint_build_on",
+ "ddd": 0,
+ "assets": [],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": "fingerprint_build_on",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 91.456,
+ 92.206,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 20,
+ 25,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 350,
+ 350,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.2,
+ 0
+ ],
+ [
+ 2.217,
+ 2.066
+ ]
+ ],
+ "o": [
+ [
+ -2.217,
+ 2.066
+ ],
+ [
+ -3.2,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 8.75,
+ -1.667
+ ],
+ [
+ 0,
+ 1.667
+ ],
+ [
+ -8.75,
+ -1.667
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 100,
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 24,
+ "s": [
+ 2.5
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "d": [
+ {
+ "n": "d",
+ "nm": "dash",
+ "v": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ }
+ },
+ {
+ "n": "o",
+ "nm": "offset",
+ "v": {
+ "a": 0,
+ "k": 0,
+ "ix": 7
+ }
+ }
+ ],
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 20,
+ 42.083
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.883,
+ 0
+ ],
+ [
+ -2.367,
+ -3.933
+ ]
+ ],
+ "o": [
+ [
+ 2.367,
+ -3.933
+ ],
+ [
+ 5.883,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -13.75,
+ 3.333
+ ],
+ [
+ 0,
+ -3.333
+ ],
+ [
+ 13.75,
+ 3.333
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 100,
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 24,
+ "s": [
+ 2.5
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 20,
+ 16.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -3.684,
+ 0
+ ],
+ [
+ -2.883,
+ -1.583
+ ]
+ ],
+ "o": [
+ [
+ 2.883,
+ -1.583
+ ],
+ [
+ 3.683,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -10.417,
+ 1.25
+ ],
+ [
+ 0.001,
+ -1.25
+ ],
+ [
+ 10.417,
+ 1.25
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 100,
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 24,
+ "s": [
+ 2.5
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.999,
+ 7.5
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 3,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.65,
+ 0
+ ],
+ [
+ 0,
+ -5.9
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.333,
+ 0
+ ],
+ [
+ 0.633,
+ 1.601
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.717,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ],
+ [
+ -2.15,
+ -1.716
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -0.767,
+ -2.134
+ ],
+ [
+ 0,
+ -5.917
+ ],
+ [
+ 6.65,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.333
+ ],
+ [
+ -1.734,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.634,
+ -1.599
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 2.75
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -11.108,
+ 5.825
+ ],
+ [
+ -11.875,
+ 1.525
+ ],
+ [
+ -0.208,
+ -9.175
+ ],
+ [
+ 11.875,
+ 1.525
+ ],
+ [
+ 11.875,
+ 1.592
+ ],
+ [
+ 7.659,
+ 5.808
+ ],
+ [
+ 3.742,
+ 3.158
+ ],
+ [
+ 2.526,
+ 0.141
+ ],
+ [
+ -1.391,
+ -2.508
+ ],
+ [
+ -1.641,
+ -2.508
+ ],
+ [
+ -5.625,
+ 1.475
+ ],
+ [
+ -2.225,
+ 8.558
+ ],
+ [
+ -1.458,
+ 9.175
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 100,
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 24,
+ "s": [
+ 2.5
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 19.992,
+ 28.758
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 4,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 600,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": [
+ {
+ "tm": 210,
+ "cm": "2",
+ "dr": 0
+ },
+ {
+ "tm": 255,
+ "cm": "1",
+ "dr": 0
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java
index 2d403f6..1f11894 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationView.java
@@ -74,7 +74,10 @@
return false;
}
- protected void updateAlpha() {
+ /**
+ * @return current alpha
+ */
+ protected int updateAlpha() {
int alpha = calculateAlpha();
getDrawable().setAlpha(alpha);
@@ -84,6 +87,8 @@
} else {
((ViewGroup) getParent()).setVisibility(View.VISIBLE);
}
+
+ return alpha;
}
int calculateAlpha() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java
index 7f4d7fe0..2cdf49d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java
@@ -43,11 +43,6 @@
}
@Override
- protected void updateAlpha() {
- super.updateAlpha();
- }
-
- @Override
protected void onFinishInflate() {
mFingerprintView = findViewById(R.id.udfps_enroll_animation_fp_view);
mFingerprintView.setImageDrawable(mFingerprintDrawable);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
deleted file mode 100644
index 8894093..0000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2021 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.biometrics;
-
-import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
-
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.util.MathUtils;
-
-import androidx.annotation.NonNull;
-
-import com.android.internal.graphics.ColorUtils;
-import com.android.settingslib.Utils;
-import com.android.systemui.R;
-import com.android.systemui.animation.Interpolators;
-import com.android.systemui.doze.DozeReceiver;
-
-/**
- * UDFPS animations that should be shown when authenticating on keyguard.
- */
-public class UdfpsKeyguardDrawable extends UdfpsDrawable implements DozeReceiver {
-
- private static final String TAG = "UdfpsAnimationKeyguard";
- private final int mAmbientDisplayColor;
- static final float DEFAULT_AOD_STROKE_WIDTH = 1f;
-
- @NonNull private final Context mContext;
- private int mLockScreenColor;
-
- // AOD anti-burn-in offsets
- private final int mMaxBurnInOffsetX;
- private final int mMaxBurnInOffsetY;
- private float mInterpolatedDarkAmount;
- private float mBurnInOffsetX;
- private float mBurnInOffsetY;
-
- private final ValueAnimator mHintAnimator = ValueAnimator.ofFloat(
- UdfpsKeyguardDrawable.DEFAULT_STROKE_WIDTH,
- .5f,
- UdfpsKeyguardDrawable.DEFAULT_STROKE_WIDTH);
-
- UdfpsKeyguardDrawable(@NonNull Context context) {
- super(context);
- mContext = context;
-
- mMaxBurnInOffsetX = context.getResources()
- .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
- mMaxBurnInOffsetY = context.getResources()
- .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
-
- mHintAnimator.setDuration(2000);
- mHintAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- mHintAnimator.addUpdateListener(anim -> setStrokeWidth((float) anim.getAnimatedValue()));
-
- mLockScreenColor = Utils.getColorAttrDefaultColor(mContext,
- R.attr.wallpaperTextColorAccent);
- mAmbientDisplayColor = Color.WHITE;
-
- updateIcon();
- }
-
- private void updateIcon() {
- mBurnInOffsetX = MathUtils.lerp(0f,
- getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
- - mMaxBurnInOffsetX,
- mInterpolatedDarkAmount);
- mBurnInOffsetY = MathUtils.lerp(0f,
- getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */)
- - mMaxBurnInOffsetY,
- mInterpolatedDarkAmount);
-
- mFingerprintDrawable.setTint(ColorUtils.blendARGB(mLockScreenColor,
- mAmbientDisplayColor, mInterpolatedDarkAmount));
- setStrokeWidth(MathUtils.lerp(DEFAULT_STROKE_WIDTH, DEFAULT_AOD_STROKE_WIDTH,
- mInterpolatedDarkAmount));
- invalidateSelf();
- }
-
- @Override
- public void dozeTimeTick() {
- updateIcon();
- }
-
- @Override
- public void draw(@NonNull Canvas canvas) {
- if (isIlluminationShowing()) {
- return;
- }
- canvas.save();
- canvas.translate(mBurnInOffsetX, mBurnInOffsetY);
- mFingerprintDrawable.draw(canvas);
- canvas.restore();
- }
-
- void animateHint() {
- mHintAnimator.start();
- }
-
- void onDozeAmountChanged(float linear, float eased) {
- mHintAnimator.cancel();
- mInterpolatedDarkAmount = eased;
- updateIcon();
- }
-
- void setLockScreenColor(int color) {
- if (mLockScreenColor == color) return;
- mLockScreenColor = color;
- updateIcon();
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index 804e2ab..ec96af3 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -16,6 +16,9 @@
package com.android.systemui.biometrics;
+import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInProgressOffset;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
@@ -23,7 +26,10 @@
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
import android.util.AttributeSet;
+import android.util.MathUtils;
import android.view.View;
import android.widget.ImageView;
@@ -34,12 +40,17 @@
import com.android.systemui.animation.Interpolators;
import com.android.systemui.statusbar.StatusBarState;
+import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.model.KeyPath;
/**
* View corresponding with udfps_keyguard_view.xml
*/
public class UdfpsKeyguardView extends UdfpsAnimationView {
- private final UdfpsKeyguardDrawable mFingerprintDrawable;
- private ImageView mFingerprintView;
+ private UdfpsDrawable mFingerprintDrawable; // placeholder
+ private LottieAnimationView mAodFp;
+ private LottieAnimationView mLockScreenFp;
+ private int mUdfpsBouncerColor;
private int mWallpaperTextColor;
private int mStatusBarState;
@@ -52,16 +63,31 @@
private AnimatorSet mAnimatorSet;
private int mAlpha; // 0-255
+ // AOD anti-burn-in offsets
+ private final int mMaxBurnInOffsetX;
+ private final int mMaxBurnInOffsetY;
+ private float mBurnInOffsetX;
+ private float mBurnInOffsetY;
+ private float mBurnInProgress;
+ private float mInterpolatedDarkAmount;
+
+ private ValueAnimator mHintAnimator;
+
public UdfpsKeyguardView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
- mFingerprintDrawable = new UdfpsKeyguardDrawable(mContext);
+ mFingerprintDrawable = new UdfpsFpDrawable(context);
+
+ mMaxBurnInOffsetX = context.getResources()
+ .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
+ mMaxBurnInOffsetY = context.getResources()
+ .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mFingerprintView = findViewById(R.id.udfps_keyguard_animation_fp_view);
- mFingerprintView.setForeground(mFingerprintDrawable);
+ mAodFp = findViewById(R.id.udfps_aod_fp);
+ mLockScreenFp = findViewById(R.id.udfps_lockscreen_fp);
mBgProtection = findViewById(R.id.udfps_keyguard_fp_bg);
@@ -69,7 +95,16 @@
R.attr.wallpaperTextColorAccent);
mTextColorPrimary = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorPrimary);
+
+ // requires call to invalidate to update the color (see #updateColor)
+ mLockScreenFp.addValueCallback(
+ new KeyPath("**"), LottieProperty.COLOR_FILTER,
+ frameInfo -> new PorterDuffColorFilter(getColor(), PorterDuff.Mode.SRC_ATOP)
+ );
mUdfpsRequested = false;
+
+ mHintAnimator = ObjectAnimator.ofFloat(mLockScreenFp, "progress", 1f, 0f, 1f);
+ mHintAnimator.setDuration(4000);
}
@Override
@@ -89,10 +124,27 @@
@Override
public boolean dozeTimeTick() {
- mFingerprintDrawable.dozeTimeTick();
+ updateBurnInOffsets();
return true;
}
+ private void updateBurnInOffsets() {
+ mBurnInOffsetX = MathUtils.lerp(0f,
+ getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
+ - mMaxBurnInOffsetX, mInterpolatedDarkAmount);
+ mBurnInOffsetY = MathUtils.lerp(0f,
+ getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */)
+ - mMaxBurnInOffsetY, mInterpolatedDarkAmount);
+ mBurnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), mInterpolatedDarkAmount);
+
+ mAodFp.setTranslationX(mBurnInOffsetX);
+ mAodFp.setTranslationY(mBurnInOffsetY);
+ mAodFp.setProgress(mBurnInProgress);
+
+ mLockScreenFp.setTranslationX(mBurnInOffsetX);
+ mLockScreenFp.setTranslationY(mBurnInOffsetY);
+ }
+
void requestUdfps(boolean request, int color) {
if (request) {
mUdfpsRequestedColor = color;
@@ -105,22 +157,31 @@
void setStatusBarState(int statusBarState) {
mStatusBarState = statusBarState;
- updateColor();
}
void updateColor() {
- mFingerprintView.setAlpha(1f);
- mFingerprintDrawable.setLockScreenColor(getColor());
+ mLockScreenFp.invalidate();
}
+ private boolean showingUdfpsBouncer() {
+ return mBgProtection.getVisibility() == View.VISIBLE;
+ }
+
+
private int getColor() {
- if (mUdfpsRequested && mUdfpsRequestedColor != -1) {
+ if (isUdfpsColorRequested()) {
return mUdfpsRequestedColor;
+ } else if (showingUdfpsBouncer()) {
+ return mUdfpsBouncerColor;
} else {
return mWallpaperTextColor;
}
}
+ private boolean isUdfpsColorRequested() {
+ return mUdfpsRequested && mUdfpsRequestedColor != -1;
+ }
+
/**
* @param alpha between 0 and 255
*/
@@ -130,6 +191,13 @@
}
@Override
+ protected int updateAlpha() {
+ int alpha = super.updateAlpha();
+ mLockScreenFp.setImageAlpha(alpha);
+ return alpha;
+ }
+
+ @Override
int calculateAlpha() {
if (mPauseAuth) {
return 0;
@@ -138,18 +206,31 @@
}
void onDozeAmountChanged(float linear, float eased) {
- mFingerprintDrawable.onDozeAmountChanged(linear, eased);
+ mHintAnimator.cancel();
+ mInterpolatedDarkAmount = eased;
+ updateBurnInOffsets();
+ mLockScreenFp.setProgress(1f - mInterpolatedDarkAmount);
+ mAodFp.setAlpha(mInterpolatedDarkAmount);
+
+ if (linear == 1f) {
+ mLockScreenFp.setVisibility(View.INVISIBLE);
+ } else {
+ mLockScreenFp.setVisibility(View.VISIBLE);
+ }
}
void animateHint() {
- mFingerprintDrawable.animateHint();
+ if (!isShadeLocked() && !mUdfpsRequested && mAlpha == 255
+ && mLockScreenFp.isVisibleToUser()) {
+ mHintAnimator.start();
+ }
}
/**
* Animates in the bg protection circle behind the fp icon to highlight the icon.
*/
void animateUdfpsBouncer(Runnable onEndAnimation) {
- if (mBgProtection.getVisibility() == View.VISIBLE && mBgProtection.getAlpha() == 1f) {
+ if (showingUdfpsBouncer() && mBgProtection.getAlpha() == 1f) {
// already fully highlighted, don't re-animate
return;
}
@@ -157,19 +238,6 @@
if (mAnimatorSet != null) {
mAnimatorSet.cancel();
}
- ValueAnimator fpIconAnim;
- if (isShadeLocked()) {
- // set color and fade in since we weren't showing before
- mFingerprintDrawable.setLockScreenColor(mTextColorPrimary);
- fpIconAnim = ObjectAnimator.ofFloat(mFingerprintView, View.ALPHA, 0f, 1f);
- } else {
- // update icon color
- fpIconAnim = new ValueAnimator();
- fpIconAnim.setIntValues(getColor(), mTextColorPrimary);
- fpIconAnim.setEvaluator(new ArgbEvaluator());
- fpIconAnim.addUpdateListener(valueAnimator -> mFingerprintDrawable.setLockScreenColor(
- (Integer) valueAnimator.getAnimatedValue()));
- }
mAnimatorSet = new AnimatorSet();
mAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
@@ -181,11 +249,31 @@
}
});
+ ValueAnimator fpIconColorAnim;
+ if (isShadeLocked()) {
+ // set color and fade in since we weren't showing before
+ mUdfpsBouncerColor = mTextColorPrimary;
+ fpIconColorAnim = ValueAnimator.ofInt(0, 255);
+ fpIconColorAnim.addUpdateListener(valueAnimator ->
+ mLockScreenFp.setImageAlpha((int) valueAnimator.getAnimatedValue()));
+ } else {
+ // update icon color
+ fpIconColorAnim = new ValueAnimator();
+ fpIconColorAnim.setIntValues(
+ isUdfpsColorRequested() ? mUdfpsRequestedColor : mWallpaperTextColor,
+ mTextColorPrimary);
+ fpIconColorAnim.setEvaluator(ArgbEvaluator.getInstance());
+ fpIconColorAnim.addUpdateListener(valueAnimator -> {
+ mUdfpsBouncerColor = (int) valueAnimator.getAnimatedValue();
+ updateColor();
+ });
+ }
+
mAnimatorSet.playTogether(
ObjectAnimator.ofFloat(mBgProtection, View.ALPHA, 0f, 1f),
ObjectAnimator.ofFloat(mBgProtection, View.SCALE_X, 0f, 1f),
ObjectAnimator.ofFloat(mBgProtection, View.SCALE_Y, 0f, 1f),
- fpIconAnim);
+ fpIconColorAnim);
mAnimatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -197,15 +285,11 @@
mAnimatorSet.start();
}
- private boolean isShadeLocked() {
- return mStatusBarState == StatusBarState.SHADE_LOCKED;
- }
-
/**
* Animates out the bg protection circle behind the fp icon to unhighlight the icon.
*/
void animateAwayUdfpsBouncer(@Nullable Runnable onEndAnimation) {
- if (mBgProtection.getVisibility() == View.GONE) {
+ if (!showingUdfpsBouncer()) {
// already hidden
return;
}
@@ -213,17 +297,25 @@
if (mAnimatorSet != null) {
mAnimatorSet.cancel();
}
- ValueAnimator fpIconAnim;
+
+ ValueAnimator fpIconColorAnim;
if (isShadeLocked()) {
// fade out
- fpIconAnim = ObjectAnimator.ofFloat(mFingerprintView, View.ALPHA, 1f, 0f);
+ mUdfpsBouncerColor = mTextColorPrimary;
+ fpIconColorAnim = ValueAnimator.ofInt(255, 0);
+ fpIconColorAnim.addUpdateListener(valueAnimator ->
+ mLockScreenFp.setImageAlpha((int) valueAnimator.getAnimatedValue()));
} else {
// update icon color
- fpIconAnim = new ValueAnimator();
- fpIconAnim.setIntValues(mTextColorPrimary, getColor());
- fpIconAnim.setEvaluator(new ArgbEvaluator());
- fpIconAnim.addUpdateListener(valueAnimator -> mFingerprintDrawable.setLockScreenColor(
- (Integer) valueAnimator.getAnimatedValue()));
+ fpIconColorAnim = new ValueAnimator();
+ fpIconColorAnim.setIntValues(
+ mTextColorPrimary,
+ isUdfpsColorRequested() ? mUdfpsRequestedColor : mWallpaperTextColor);
+ fpIconColorAnim.setEvaluator(ArgbEvaluator.getInstance());
+ fpIconColorAnim.addUpdateListener(valueAnimator -> {
+ mUdfpsBouncerColor = (int) valueAnimator.getAnimatedValue();
+ updateColor();
+ });
}
mAnimatorSet = new AnimatorSet();
@@ -231,7 +323,7 @@
ObjectAnimator.ofFloat(mBgProtection, View.ALPHA, 1f, 0f),
ObjectAnimator.ofFloat(mBgProtection, View.SCALE_X, 1f, 0f),
ObjectAnimator.ofFloat(mBgProtection, View.SCALE_Y, 1f, 0f),
- fpIconAnim);
+ fpIconColorAnim);
mAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
mAnimatorSet.setDuration(500);
@@ -244,10 +336,15 @@
}
}
});
+
mAnimatorSet.start();
}
boolean isAnimating() {
return mAnimatorSet != null && mAnimatorSet.isRunning();
}
+
+ private boolean isShadeLocked() {
+ return mStatusBarState == StatusBarState.SHADE_LOCKED;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
index 35ca470..819de53 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
@@ -316,6 +316,14 @@
}
}
+ public void onBiometricError(int msgId, String errString,
+ BiometricSourceType biometricSourceType) {
+ if (biometricSourceType == BiometricSourceType.FACE) {
+ // show udfps hint when face auth fails
+ showHint(true);
+ }
+ }
+
public void onBiometricAuthenticated(int userId,
BiometricSourceType biometricSourceType, boolean isStrongBiometric) {
if (biometricSourceType == BiometricSourceType.FACE) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt
index 73abf45..15e3f3a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt
@@ -22,6 +22,7 @@
private const val BURN_IN_PREVENTION_PERIOD_Y = 521f
private const val BURN_IN_PREVENTION_PERIOD_X = 83f
private const val BURN_IN_PREVENTION_PERIOD_SCALE = 180f
+private const val BURN_IN_PREVENTION_PERIOD_PROGRESS = 120f
/**
* Returns the translation offset that should be used to avoid burn in at
@@ -37,6 +38,15 @@
}
/**
+ * Returns a progress offset (between 0f and 1.0f) that should be used to avoid burn in at
+ * the current time.
+ */
+fun getBurnInProgressOffset(): Float {
+ return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES,
+ 1f, BURN_IN_PREVENTION_PERIOD_PROGRESS)
+}
+
+/**
* Returns a value to scale a view in order to avoid burn in.
*/
fun getBurnInScale(): Float {