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 {