Merge "Support GetMetadata for Preference Service" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2295ee3..551a7de 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -5439,6 +5439,16 @@
             </intent-filter>
         </receiver>
 
+        <receiver
+            android:name=".accessibility.HighContrastTextMigrationReceiver"
+            android:permission="android.permission.MANAGE_ACCESSIBILITY"
+            android:exported="true"> <!-- Exported for SettingsProvider restore from backup. -->
+            <intent-filter>
+                <action android:name="android.intent.action.PRE_BOOT_COMPLETED"/>
+                <action android:name="com.android.settings.accessibility.ACTION_HIGH_CONTRAST_TEXT_RESTORED"/>
+            </intent-filter>
+        </receiver>
+
         <activity
             android:name="Settings$ChangeNfcTagAppsActivity"
             android:exported="true"
diff --git a/res/drawable/ic_settings_mouse.xml b/res/drawable/ic_settings_mouse.xml
new file mode 100644
index 0000000..4ce13d1
--- /dev/null
+++ b/res/drawable/ic_settings_mouse.xml
@@ -0,0 +1,14 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+  <group>
+    <clip-path
+        android:pathData="M0,0h24v24h-24z"/>
+    <path
+        android:pathData="M12,22C10.067,22 8.417,21.317 7.05,19.95C5.683,18.583 5,16.933 5,15V9C5,7.067 5.683,5.417 7.05,4.05C8.417,2.683 10.067,2 12,2C13.933,2 15.583,2.683 16.95,4.05C18.317,5.417 19,7.067 19,9V15C19,16.933 18.317,18.583 16.95,19.95C15.583,21.317 13.933,22 12,22ZM13,9H17C17,7.8 16.617,6.742 15.85,5.825C15.1,4.908 14.15,4.333 13,4.1V9ZM7,9H11V4.1C9.85,4.333 8.892,4.908 8.125,5.825C7.375,6.742 7,7.8 7,9ZM12,20C13.383,20 14.558,19.517 15.525,18.55C16.508,17.567 17,16.383 17,15V11H7V15C7,16.383 7.483,17.567 8.45,18.55C9.433,19.517 10.617,20 12,20Z"
+        android:fillColor="@android:color/white"/>
+  </group>
+</vector>
\ No newline at end of file
diff --git a/res/raw/lottie_bubbles.json b/res/raw/lottie_bubbles.json
index e69de29..b0e5993 100644
--- a/res/raw/lottie_bubbles.json
+++ b/res/raw/lottie_bubbles.json
@@ -0,0 +1 @@
+{"v":"5.7.8","fr":60,"ip":0,"op":406,"w":412,"h":300,"nm":"Bubbles_EDU","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[165.599,75.148,0],"ix":2,"l":2},"a":{"a":0,"k":[4,4,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.693],[1.693,0],[0,1.693],[-1.694,0]],"o":[[0,1.693],[-1.694,0],[0,-1.693],[1.693,0]],"v":[[3.066,0],[0.001,3.065],[-3.066,0],[0.001,-3.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.715,4.306],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":381,"st":-219,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[261.163,141.906,0],"ix":2,"l":2},"a":{"a":0,"k":[4,4,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.693],[1.693,0],[0,1.693],[-1.694,0]],"o":[[0,1.693],[-1.694,0],[0,-1.693],[1.693,0]],"v":[[3.066,0],[0.001,3.065],[-3.066,0],[0.001,-3.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.715,4.306],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":239,"st":20,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":".red400","cl":"red400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[184.011,75.101,0],"ix":2,"l":2},"a":{"a":0,"k":[3.5,3.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":158,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":180,"s":[90,90,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[1,1,0.8],"y":[0,0,0]},"t":275,"s":[90,90,100]},{"t":297,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.693],[1.693,0],[0,1.693],[-1.694,0]],"o":[[0,1.693],[-1.694,0],[0,-1.693],[1.693,0]],"v":[[3.066,0],[0.001,3.065],[-3.066,0],[0.001,-3.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333333333,0.403921568627,0.360784313725,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.464,3.623],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":".yellow400","cl":"yellow400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[203.168,75.101,0],"ix":2,"l":2},"a":{"a":0,"k":[3.5,3.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":160,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":182,"s":[90,90,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[1,1,0.8],"y":[0,0,0]},"t":273,"s":[90,90,100]},{"t":295,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.693],[1.693,0],[0,1.693],[-1.694,0]],"o":[[0,1.693],[-1.694,0],[0,-1.693],[1.693,0]],"v":[[3.066,0],[0.001,3.065],[-3.066,0],[0.001,-3.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.788235294118,0.203921568627,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.643,3.623],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":".green400","cl":"green400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[221.926,75.104,0],"ix":2,"l":2},"a":{"a":0,"k":[4,3.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":162,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":184,"s":[90,90,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[1,1,0.8],"y":[0,0,0]},"t":271,"s":[90,90,100]},{"t":293,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.004,-1.693],[1.693,-0.005],[0.005,1.693],[-1.694,0.004]],"o":[[0.005,1.693],[-1.693,0.004],[-0.004,-1.693],[1.693,-0.005]],"v":[[3.065,-0.008],[0.008,3.066],[-3.066,0.008],[-0.008,-3.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862745098,0.725490196078,0.454901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.725,3.634],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Touch 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":254,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":272,"s":[59]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":273,"s":[59]},{"t":288,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[226.55,48.3,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[9,9,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":254,"s":[200,200]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":272,"s":[150,150]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":273,"s":[150,150]},{"t":288,"s":[200,200]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":1000,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.0941176489,0.537254929543,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.983088254929,0.665331482887,0.832399487495,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":254,"op":288,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Touch 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":122,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[59]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":134,"s":[59]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252.3,140.8,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[9,9,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":122,"s":[200,200]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":133,"s":[150,150]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":134,"s":[150,150]},{"t":149,"s":[200,200]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":1000,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.0941176489,0.537254929543,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.983088254929,0.665331482887,0.832399487495,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":122,"op":149,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey300","cl":"grey300","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":312,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.95,154.75,0],"ix":2,"l":2},"a":{"a":0,"k":[67,1,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,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]],"o":[[0,0],[0,0]],"v":[[0.832,1.105],[133.152,1.105]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".grey300","cl":"grey300","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":312,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,213.25,0],"ix":2,"l":2},"a":{"a":0,"k":[36,49,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.2,0],[0,0],[0,2.199],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.2,0],[0,0],[0,2.199]],"v":[[4.009,8.009],[-4.009,8.009],[-8.009,4.009],[-8.009,-4.009],[-4.009,-8.009],[4.009,-8.009],[8.009,-4.009],[8.009,4.009]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.647,57.865],"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":2,"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":[[2.2,0],[0,0],[0,2.2],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.2,0],[0,0],[0,2.2]],"v":[[4.009,8.008],[-4.009,8.008],[-8.009,4.008],[-8.009,-4.008],[-4.009,-8.008],[4.009,-8.008],[8.009,-4.008],[8.009,4.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.647,33.26],"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":2,"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":[[2.2,0],[0,0],[0,2.2],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.2,0],[0,0],[0,2.2]],"v":[[4.009,8.008],[-4.009,8.008],[-8.009,4.008],[-8.009,-4.008],[-4.009,-8.008],[4.009,-8.008],[8.009,-4.008],[8.009,4.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.647,8.655],"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":2,"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":[[2.199,0],[0,0],[0,2.199],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.199,0],[0,0],[0,2.199]],"v":[[4.009,8.009],[-4.009,8.009],[-8.009,4.009],[-8.009,-4.009],[-4.009,-8.009],[4.009,-8.009],[8.009,-4.009],[8.009,4.009]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.658,57.865],"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":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.199,0],[0,0],[0,2.2],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.199,0],[0,0],[0,2.2]],"v":[[4.009,8.008],[-4.009,8.008],[-8.009,4.008],[-8.009,-4.008],[-4.009,-8.008],[4.009,-8.008],[8.009,-4.008],[8.009,4.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.658,33.26],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.199,0],[0,0],[0,2.2],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.199,0],[0,0],[0,2.2]],"v":[[4.009,8.008],[-4.009,8.008],[-8.009,4.008],[-8.009,-4.008],[-4.009,-8.008],[4.009,-8.008],[8.009,-4.008],[8.009,4.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.658,8.655],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.2,0],[0,0],[0,2.199],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.2,0],[0,0],[0,2.199]],"v":[[4.009,8.009],[-4.009,8.009],[-8.009,4.009],[-8.009,-4.009],[-4.009,-8.009],[4.009,-8.009],[8.009,-4.009],[8.009,4.009]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.353,57.865],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.2,0],[0,0],[0,2.2],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.2,0],[0,0],[0,2.2]],"v":[[4.009,8.008],[-4.009,8.008],[-8.009,4.008],[-8.009,-4.008],[-4.009,-8.008],[4.009,-8.008],[8.009,-4.008],[8.009,4.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.353,33.26],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.2,0],[0,0],[0,2.2],[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0]],"o":[[0,0],[-2.2,0],[0,0],[0,-2.2],[0,0],[2.2,0],[0,0],[0,2.2]],"v":[[4.009,8.008],[-4.009,8.008],[-8.009,4.008],[-8.009,-4.008],[-4.009,-8.008],[4.009,-8.008],[8.009,-4.008],[8.009,4.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.353,8.655],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.694],[4.694,0],[0,4.694],[-4.694,0]],"o":[[0,4.694],[-4.694,0],[0,-4.694],[4.694,0]],"v":[[8.5,0],[0,8.5],[-8.5,0],[0,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[36,88.481],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".grey300","cl":"grey300","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":312,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,264.1,0],"ix":2,"l":2},"a":{"a":0,"k":[16,1.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.34,0],[0,0],[0,-0.34],[-0.34,0],[0,0],[0,0.34]],"o":[[0,0],[-0.34,0],[0,0.34],[0,0],[0.34,0],[0,-0.34]],"v":[[14.795,-0.618],[-14.795,-0.618],[-15.413,0],[-14.795,0.618],[14.795,0.618],[15.413,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16,1.309],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey300","cl":"grey300","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,264.1,0],"ix":2,"l":2},"a":{"a":0,"k":[16,1.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.34,0],[0,0],[0,-0.34],[-0.34,0],[0,0],[0,0.34]],"o":[[0,0],[-0.34,0],[0,0.34],[0,0],[0.34,0],[0,-0.34]],"v":[[14.795,-0.618],[-14.795,-0.618],[-15.413,0],[-14.795,0.618],[14.795,0.618],[15.413,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854902020623,0.862745157878,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16,1.309],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"ChatMatte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Top Ui Notification Outlines","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":286.428,"s":[100]},{"t":299,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.95,94,0],"ix":2,"l":2},"a":{"a":0,"k":[64,10.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.866],[3.866,0],[0,3.866],[-3.866,0]],"o":[[0,3.866],[-3.866,0],[0,-3.866],[3.866,0]],"v":[[7,0],[0,7],[-7,0],[0,-7]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.922,7.969],"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":2,"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],[0,0]],"o":[[0,0],[0,0]],"v":[[1.284,19.79],[126.691,19.79]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.947865325329,0.955448584463,0.959243056353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":2,"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.914,0],[0,0],[0,0.913],[0,0],[0.914,0],[0,0],[0,-0.939],[0,0]],"o":[[0,0],[0.914,0],[0,0],[0,-0.914],[0,0],[-0.94,0],[0,0],[0,0.913]],"v":[[-6.199,1.684],[6.199,1.684],[7.861,0.023],[7.861,-0.023],[6.199,-1.684],[-6.153,-1.684],[-7.861,0.023],[-7.861,0.023]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.914689307119,0.922272566253,0.932703414618,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.414,10.243],"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":2,"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.909,0],[0,0],[0,0.909],[0,0],[0.91,0],[0,0],[0,-0.944]],"o":[[0,0],[0.91,0],[0,0],[0,-0.909],[0,0],[-0.944,0],[0,0.909]],"v":[[-12.824,1.684],[12.824,1.684],[14.478,0.031],[14.478,-0.031],[12.824,-1.684],[-12.762,-1.684],[-14.478,0.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.914689307119,0.922272566253,0.932703414618,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.031,5.695],"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":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.457,0],[0,0],[0,2.457],[-2.457,0],[0,-2.457]],"o":[[0,0],[-2.457,0],[0,-2.457],[2.457,0],[0,2.457]],"v":[[0,4.449],[0,4.449],[-4.448,-0.001],[0,-4.449],[4.448,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.312,7.969],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.457,0],[0,0],[0,2.457],[-2.457,0],[0,-2.457]],"o":[[0,0],[-2.457,0],[0,-2.457],[2.457,0],[0,2.457]],"v":[[0,4.449],[0,4.449],[-4.448,-0.001],[0,-4.449],[4.448,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[106.902,7.969],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.457,0],[0,0],[0,2.457],[-2.457,0],[0,-2.457]],"o":[[0,0],[-2.457,0],[0,-2.457],[2.457,0],[0,2.457]],"v":[[0.001,4.449],[0.001,4.449],[-4.449,-0.001],[0.001,-4.449],[4.449,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[118.492,7.969],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ChatMatte 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Chat 01 Outlines","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":283,"s":[100]},{"t":299,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":188.85,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":160,"s":[145.75]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":181,"s":[155.2]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":275,"s":[155.2]},{"t":299,"s":[145.75]}],"ix":4}},"a":{"a":0,"k":[39,8.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.078,0],[0,0],[0,4.078],[4.078,0],[0,0],[0,-4.077]],"o":[[0,0],[4.078,0],[0,-4.077],[0,0],[-4.078,0],[0,4.078]],"v":[[-30.765,7.414],[30.765,7.414],[38.179,0],[30.765,-7.414],[-30.765,-7.414],[-38.179,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.914689307119,0.922272566253,0.932703414618,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.617,8.627],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"ChatMatte 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Chat 02 Outlines","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":280.715,"s":[100]},{"t":299,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":223.05,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":160,"s":[162.4]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":181,"s":[171.85]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":275,"s":[171.85]},{"t":299,"s":[162.4]}],"ix":4}},"a":{"a":0,"k":[39,8,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.077,0],[0,0],[0,4.078],[-4.077,0],[0,0],[0,-4.077]],"o":[[0,0],[-4.077,0],[0,-4.077],[0,0],[4.077,0],[0,4.078]],"v":[[30.766,7.414],[-30.765,7.414],[-38.179,0],[-30.765,-7.414],[30.766,-7.414],[38.179,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.797,8.291],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"ChatMatte 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Chat 03 Outlines","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":178,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":278.428,"s":[100]},{"t":299,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":223.05,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":160,"s":[182.65]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":181,"s":[192.1]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":275,"s":[192.1]},{"t":299,"s":[182.65]}],"ix":4}},"a":{"a":0,"k":[39,11.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.904,0],[0,0],[0,5.904],[-5.904,0],[0,0],[0,-5.905]],"o":[[0,0],[-5.904,0],[0,-5.905],[0,0],[5.905,0],[0,5.904]],"v":[[27.445,10.736],[-27.444,10.736],[-38.179,0.001],[-27.444,-10.736],[27.444,-10.736],[38.179,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.797,11.276],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"ChatMatte 5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Chat 04 Outlines","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":276.143,"s":[100]},{"t":299,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":188.85,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":160,"s":[202]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":181,"s":[211.45]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":275,"s":[211.45]},{"t":299,"s":[202]}],"ix":4}},"a":{"a":0,"k":[39,8,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.078,0],[0,0],[0,4.078],[4.078,0],[0,0],[0,-4.078]],"o":[[0,0],[4.078,0],[0,-4.078],[0,0],[-4.078,0],[0,4.078]],"v":[[-30.765,7.414],[30.765,7.414],[38.179,0],[30.765,-7.414],[-30.765,-7.414],[-38.179,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.914689307119,0.922272566253,0.932703414618,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.617,8.262],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"ChatMatte 6","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Chat 05 Outlines","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":181,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":275,"s":[100]},{"t":299,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":205.95,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":160,"s":[227.65]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":181,"s":[237.1]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":275,"s":[237.1]},{"t":299,"s":[227.65]}],"ix":4}},"a":{"a":0,"k":[58,8.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.457,0],[0,0],[0,2.456],[-2.457,0],[0,-2.457]],"o":[[0,0],[-2.457,0],[0,-2.457],[2.457,0],[0,2.456]],"v":[[0,4.449],[0,4.449],[-4.448,0.001],[0,-4.449],[4.448,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.892,8.624],"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":2,"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":[[2.457,0],[0,0],[0,2.456],[-2.457,0],[0,-2.457]],"o":[[0,0],[-2.457,0],[0,-2.457],[2.457,0],[0,2.456]],"v":[[0,4.449],[0,4.449],[-4.448,0.001],[0,-4.449],[4.448,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.481,8.624],"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":2,"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":[[2.457,0],[0,0],[0,2.456],[-2.457,0],[0,-2.457]],"o":[[0,0],[-2.457,0],[0,-2.457],[2.457,0],[0,2.456]],"v":[[0.001,4.449],[0.001,4.449],[-4.449,0.001],[0.001,-4.449],[4.449,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.071,8.624],"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":2,"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":[[-3.79,0],[0,0],[0,3.79],[0,0],[3.79,0],[0,0],[0,-4.034],[0,0]],"o":[[0,0],[3.79,0],[0,0],[0,-3.791],[0,0],[-4.033,0],[0,0],[0,3.79]],"v":[[-33.09,7.414],[33.092,7.414],[39.982,0.522],[39.982,-0.523],[33.092,-7.414],[-32.648,-7.414],[-39.982,-0.08],[-39.982,0.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.914689307119,0.922272566253,0.932703414618,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.994,8.624],"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":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Chat Pointer Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":165,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":292.143,"s":[100]},{"t":293.28515625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":165,"s":[158.7,84.325,0],"to":[0,-0.412,0],"ti":[0,0.412,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[158.7,81.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":289.857,"s":[158.7,81.85,0],"to":[0,0.413,0],"ti":[0,-0.413,0]},{"t":293.28515625,"s":[158.7,84.325,0]}],"ix":2,"l":2},"a":{"a":0,"k":[3.5,3,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,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],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-2.786,1.115],[-0.001,-1.115],[2.786,1.115]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.874,1.475],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":616,"st":16,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"ChatMatte 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[24]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":293.285,"s":[100]},{"t":299,"s":[24]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,166.75,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.575,-36.689,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":160,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":181,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":275,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.5,83.478],[53.5,86.478],[-53.5,86.478],[-56.5,83.478],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]},{"t":299,"s":[{"i":[[0,-1.657],[0,0],[1.657,0],[0,0],[0,1.657],[0,0],[-1.657,0],[0,0]],"o":[[0,0],[0,1.657],[0,0],[-1.657,0],[0,0],[0,-1.657],[0,0],[1.657,0]],"v":[[56.5,-83.478],[56.575,-89.522],[53.575,-86.522],[-53.425,-86.522],[-56.425,-89.522],[-56.5,-83.478],[-53.5,-86.478],[53.5,-86.478]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.575,-36.689],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":160,"op":600,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":".blue300","cl":"blue300","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[244.662,135.587,0],"ix":2,"l":2},"a":{"a":0,"k":[38,8.125,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":45,"s":[0,0,100]},{"i":{"x":[0.71,0.71,0.833],"y":[1,1,1]},"o":{"x":[0.318,0.318,0.001],"y":[0,0,0]},"t":59,"s":[94.5,94.5,100]},{"t":68,"s":[90,90,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],[0,0],[1.244,0],[0,0],[0,-1.244],[0,0],[-1.244,0],[0,0],[0,1.244],[0,0]],"o":[[0,0],[0,0],[0,-1.244],[0,0],[-1.244,0],[0,0],[0,1.244],[0,0],[1.244,0],[0,0],[0,0]],"v":[[18.328,0],[17.101,-1.227],[17.101,-4.883],[14.84,-7.145],[-16.067,-7.145],[-18.328,-4.883],[-18.328,4.883],[-16.067,7.145],[14.84,7.145],[17.101,4.883],[17.101,1.227]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541176470588,0.705882352941,0.972549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.046,8.106],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":".grey300","cl":"grey300","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,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.243,0],[0,0],[0,5.244],[0,0],[-5.243,0],[0,0],[0,-5.244]],"o":[[0,5.244],[0,0],[-5.243,0],[0,0],[0,-5.244],[0,0],[5.243,0],[0,0]],"v":[[64.188,114.112],[54.679,123.622],[-54.679,123.622],[-64.188,114.112],[-64.188,-114.112],[-54.679,-123.622],[54.679,-123.622],[64.188,-114.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,1.313],[0,0],[1.313,0],[0,0],[6.554,0],[0,0],[0,-6.555],[0,0],[-6.554,0],[0,0],[0,6.555],[0,0],[0,1.313],[0,0],[1.313,0],[0,0]],"o":[[0,0],[0,-1.313],[0,0],[0,-6.555],[0,0],[-6.554,0],[0,0],[0,6.555],[0,0],[6.554,0],[0,0],[1.313,0],[0,0],[0,-1.313],[0,0],[1.313,0]],"v":[[68.943,-52.302],[68.943,-61.811],[66.566,-64.188],[66.566,-114.112],[54.679,-126],[-54.679,-126],[-66.566,-114.112],[-66.566,114.112],[-54.679,126],[54.679,126],[66.566,114.112],[66.566,-2.378],[68.943,-4.755],[68.943,-28.528],[66.566,-30.906],[66.566,-49.924]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901969433,0.86274510622,0.878431379795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":1800,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":0,"nm":"BlueDot","parent":24,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[62.89,101.169,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[111.111,111.111,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":239,"op":620,"st":239,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":".blue50","cl":"blue50","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.437],"y":[1]},"o":{"x":[0.637],"y":[0]},"t":294,"s":[159.299]},{"t":324,"s":[254.963]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.152],"y":[1]},"o":{"x":[0.414],"y":[0]},"t":306,"s":[68.848]},{"t":350,"s":[135.585]}],"ix":4}},"a":{"a":0,"k":[11,11,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.694],[4.694,0],[0,4.694],[-4.694,0]],"o":[[0,4.694],[-4.694,0],[0,-4.694],[4.694,0]],"v":[[8.5,0],[0,8.5],[-8.5,0],[0,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11,11],"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":239,"op":600,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":0,"nm":"BlueDot","parent":26,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-43.429,27.058,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[111.111,111.111,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":239,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":".blue50","cl":"blue50","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":144,"s":[254.963,135.566,0],"to":[0.004,-63.556,0],"ti":[94.364,1.013,0]},{"t":168,"s":[159.299,68.86,0],"h":1},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":288.551,"s":[158.486,68.672,0],"to":[82.114,1.013,0],"ti":[-0.996,-58.556,0]},{"t":332,"s":[254.65,134.91,0]}],"ix":2,"l":2},"a":{"a":0,"k":[11,11,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.694],[4.694,0],[0,4.694],[-4.694,0]],"o":[[0,4.694],[-4.694,0],[0,-4.694],[4.694,0]],"v":[[8.5,0],[0,8.5],[-8.5,0],[0,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11,11],"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":239,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":0,"nm":"RedDot","parent":28,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40.056,99.722,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[111.111,111.111,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":".red50","cl":"red50","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155.854,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":302,"s":[100]},{"t":315,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":144,"s":[254.775,135.175,0],"to":[-0.412,-66.188,0],"ti":[73.312,0.488,0]},{"t":169,"s":[178.05,68.8,0],"h":1},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":287.242,"s":[178.05,68.8,0],"to":[73.312,0.488,0],"ti":[-0.413,-66.188,0]},{"t":329,"s":[254.775,135.175,0]}],"ix":2,"l":2},"a":{"a":0,"k":[9,9.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.694],[4.695,0],[0,4.695],[-4.694,0]],"o":[[0,4.695],[-4.694,0],[0,-4.694],[4.695,0]],"v":[[8.5,0],[0,8.5],[-8.5,0],[0,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294118,0.909803921569,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.054,9.655],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":29,"ty":0,"nm":"YellowDot","parent":30,"refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.056,99.722,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[111.111,111.111,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":".yellow50","cl":"yellow50","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":146.734,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":158.588,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300.885,"s":[100]},{"t":314,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":144,"s":[254.55,134.95,0],"to":[0.3,-65.925,0],"ti":[57.75,0.225,0]},{"t":170,"s":[196.95,68.8,0],"h":1},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":285.93,"s":[196.95,68.8,0],"to":[57.75,0.225,0],"ti":[0.3,-65.925,0]},{"t":327,"s":[254.55,134.95,0]}],"ix":2,"l":2},"a":{"a":0,"k":[9,9.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.694],[4.694,0],[0,4.695],[-4.694,0]],"o":[[0,4.695],[-4.694,0],[0,-4.694],[4.694,0]],"v":[[8.5,0],[0,8.5],[-8.5,0],[0,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,0.96862745098,0.878431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.234,9.655],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":31,"ty":0,"nm":"GreenDot","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":".green50","cl":"green50","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":149.471,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":161.324,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":297.301,"s":[100]},{"t":312,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":144,"s":[255,134.95,0],"to":[-0.3,-65.925,0],"ti":[39.225,0.225,0]},{"t":171,"s":[215.4,68.8,0],"h":1},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":284.621,"s":[215.4,68.8,0],"to":[39.225,0.225,0],"ti":[-0.3,-65.925,0]},{"t":325,"s":[255,134.95,0]}],"ix":2,"l":2},"a":{"a":0,"k":[9.5,9.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.013,-4.694],[4.695,-0.012],[0.013,4.694],[-4.695,0.013]],"o":[[0.013,4.694],[-4.694,0.013],[-0.013,-4.694],[4.694,-0.012]],"v":[[8.5,-0.023],[0.022,8.499],[-8.5,0.023],[-0.022,-8.501]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.956862745098,0.917647058824,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.297,9.684],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"BlueDot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.657,75.109,0],"ix":2,"l":2},"a":{"a":0,"k":[3.5,3.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":164,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":186,"s":[90,90,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[1,1,0.8],"y":[0,0,0]},"t":269,"s":[90,90,100]},{"t":291,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.693],[1.693,0],[0,1.693],[-1.694,0]],"o":[[0,1.693],[-1.694,0],[0,-1.693],[1.693,0]],"v":[[3.066,0],[0.001,3.065],[-3.066,0],[0.001,-3.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.297618701411,0.5469255036,0.959243056353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.331,3.623],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"BlueBubble","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":152.205,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":164.059,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":293.715,"s":[100]},{"t":309.25,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":144,"s":[254.775,134.725,0],"to":[-0.15,-65.475,0],"ti":[20.362,0.188,0]},{"t":172,"s":[233.85,68.8,0],"h":1},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":283.311,"s":[233.85,68.8,0],"to":[20.362,0.188,0],"ti":[-0.15,-65.475,0]},{"t":325,"s":[254.775,134.725,0]}],"ix":2,"l":2},"a":{"a":0,"k":[9,9.5,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.694],[4.694,0],[0,4.695],[-4.694,0]],"o":[[0,4.695],[-4.694,0],[0,-4.694],[4.694,0]],"v":[[8.5,0],[0,8.5],[-8.5,0],[0,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.922,9.655],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"+","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":283,"s":[100]},{"t":300,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":144,"s":[254.668,134.855,0],"to":[-0.387,-11.006,0],"ti":[2.531,0.405,0]},{"t":173,"s":[252.345,68.82,0],"h":1},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":282,"s":[252.345,68.82,0],"to":[2.531,0.405,0],"ti":[-0.304,-9.922,0]},{"t":325,"s":[254.668,134.855,0]}],"ix":2,"l":2},"a":{"a":0,"k":[9,9,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,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],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3,0.5],[-3,0.5],[-3,-0.5],[3,-0.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.204000001795,0.455000005984,0.877999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.797,9.063],"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":2,"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],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.5,3],[-0.5,3],[-0.5,-3],[0.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.204000001795,0.455000005984,0.877999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.797,9.063],"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":2,"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.013,-4.694],[4.695,-0.012],[0.013,4.695],[-4.695,0.013]],"o":[[0.013,4.694],[-4.694,0.013],[-0.012,-4.694],[4.694,-0.012]],"v":[[8.5,-0.023],[0.021,8.499],[-8.5,0.023],[-0.022,-8.501]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.797,9.064],"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":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":".grey600","cl":"grey600","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":284,"s":[100]},{"t":316,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[67,133,0],"ix":1,"l":2},"s":{"a":0,"k":[96.6,94,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.77,0],[0,0],[0,2.769],[0,0],[-5.334,0.268],[0,0],[0,-2.769],[0,0]],"o":[[0,0],[-2.769,0],[0,0],[0.09,-4.634],[0,0],[2.77,0],[0,0],[0,2.769]],"v":[[58.38,132.51],[-59.674,132.51],[-67.363,124.149],[-67.363,-122.821],[-58.315,-132.51],[58.38,-132.51],[67.298,-126.81],[67.298,124.149]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[66.985,133.061],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":620,"st":20,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index febdb04..5de6222 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1425,6 +1425,14 @@
         <item>sat</item>
     </string-array>
 
+    <!-- A list for measurement system. [DO NOT TRANSLATE] -->
+    <string-array name="measurement_system">
+        <item>default</item>
+        <item>metric</item>
+        <item>ussystem</item>
+        <item>uksystem</item>
+    </string-array>
+
     <!-- Screen flash notification color when activating -->
     <array name="screen_flash_notification_preset_opacity_colors">
         <item>@color/screen_flash_preset_opacity_color_01</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6fc9fb1..8faf62a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -490,6 +490,8 @@
     <string name="first_day_of_week_preferences_title">First day of week</string>
     <!-- The title of the menu entry of Numbers system preference. [CHAR LIMIT=50]  -->
     <string name="numbers_preferences_title">Numbers preferences</string>
+    <!-- The title of the  menu entry of Measurement system preference. [CHAR LIMIT=50]  -->
+    <string name="measurement_system_preferences_title">Measurement system</string>
     <!-- The summary of default string for each regional preference. [CHAR LIMIT=50] -->
     <string name="default_string_of_regional_preference">Use default</string>
     <!-- The title of Celsius for preference of temperature unit. [CHAR LIMIT=50] -->
@@ -516,6 +518,12 @@
     <string name="desc_regional_pref_footer_learn_more">Learn more about language preferences.</string>
     <!-- Support link for the regional preference page. [CHAR LIMIT=NONE]-->
     <string name="regional_pref_footer_learn_more_link" translatable="false">https://support.google.com/android?p=regional_preferences</string>
+    <!-- The title of metric for preference of measurement system. [CHAR LIMIT=50] -->
+    <string name="metric_measurement_system">Metric</string>
+    <!-- The title of imperial US for preference of measurement system. [CHAR LIMIT=50] -->
+    <string name="us_measurement_system">Imperial (US)</string>
+    <!-- The title of imperial UK for preference of measurement system. [CHAR LIMIT=50] -->
+    <string name="uk_measurement_system">Imperial (UK)</string>
 
     <!-- Category for the terms of address. [CHAR LIMIT=NONE]-->
     <string name="category_title_terms_of_address">Additional preferences</string>
@@ -4572,17 +4580,17 @@
     <!-- Title for the 'Bounce keys' preference switch. [CHAR LIMIT=35] -->
     <string name="bounce_keys">Bounce keys</string>
     <!-- Summary text for the 'Bounce keys' preference sub-screen. [CHAR LIMIT=300] -->
-    <string name="bounce_keys_summary">The keyboard ignores quickly repeated presses of the same key </string>
+    <string name="bounce_keys_summary">Ignore quickly repeated presses of the same key</string>
     <!-- Title for the 'Bounce keys' threshold dialog. [CHAR LIMIT=35] -->
-    <string name="bounce_keys_dialog_title">Bounce key threshold</string>
+    <string name="bounce_keys_dialog_title">Bounce key delay</string>
     <!-- Subtitle for the 'Bounce keys' threshold dialog. [CHAR LIMIT=300] -->
-    <string name="bounce_keys_dialog_subtitle">Choose the duration of time your keyboard ignores repeated key presses</string>
+    <string name="bounce_keys_dialog_subtitle">Choose how long the keyboard ignores repeated keystrokes</string>
     <!-- Option title for the input setting keys threshold dialog for 200 millisecond. [CHAR LIMIT=35] -->
-    <string name="input_setting_keys_dialog_option_200">0.2s</string>
+    <string name="input_setting_keys_dialog_option_200">0.2 seconds</string>
     <!-- Option title for the input setting keys threshold dialog for 400 millisecond. [CHAR LIMIT=35] -->
-    <string name="input_setting_keys_dialog_option_400">0.4s</string>
+    <string name="input_setting_keys_dialog_option_400">0.4 seconds</string>
     <!-- Option title for the input setting keys threshold dialog for 600 millisecond. [CHAR LIMIT=35] -->
-    <string name="input_setting_keys_dialog_option_600">0.6s</string>
+    <string name="input_setting_keys_dialog_option_600">0.6 seconds</string>
     <!-- Option title for the input setting keys threshold dialog for custom value. [CHAR LIMIT=35] -->
     <string name="input_setting_keys_custom_title">Custom</string>
     <!-- Option subtitle for the input setting keys threshold dialog for custom value. [CHAR LIMIT=35] -->
@@ -4591,7 +4599,7 @@
     <!-- Title for the 'Slow keys' preference switch. [CHAR LIMIT=35] -->
     <string name="slow_keys">Slow keys</string>
     <!-- Summary text for the 'Slow keys' preference sub-screen. [CHAR LIMIT=300] -->
-    <string name="slow_keys_summary">Adjusts the time it takes for a key press to activate</string>
+    <string name="slow_keys_summary">Change how long you need to hold down a key before it\'s registered</string>
     <!-- Title for the 'Sticky keys' preference switch. [CHAR LIMIT=35] -->
     <string name="sticky_keys">Sticky keys</string>
     <!-- Summary text for the 'Sticky keys' preference sub-screen. [CHAR LIMIT=300] -->
@@ -4642,6 +4650,8 @@
     <string name="trackpad_mouse_settings">Touchpad &amp; mouse</string>
     <!-- Title for the button to trigger the 'mouse settings' page if connect with a mouse. [CHAR LIMIT=35] -->
     <string name="mouse_settings">Mouse</string>
+    <!-- Summary text for mouse setting page. [CHAR LIMIT=35] -->
+    <string name="mouse_settings_summary">Pointer speed, swap buttons, button customisation</string>
     <!-- Summary text for the 'trackpad settings' page. [CHAR LIMIT=100] -->
     <string name="trackpad_settings_summary">Pointer speed, gestures</string>
 
@@ -5387,6 +5397,10 @@
     <string name="accessibility_toggle_high_text_contrast_preference_title">High contrast text</string>
     <!-- Summary for the accessibility preference to high contrast text. [CHAR LIMIT=NONE] -->
     <string name="accessibility_toggle_high_text_contrast_preference_summary">Change text color to black or white. Maximizes contrast with the background.</string>
+    <!-- Content for the notification to high contrast text. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_notification_high_contrast_text_content">High contrast text has a new look and feel.</string>
+    <!-- Action for the notification to high contrast text. [CHAR LIMIT=35] -->
+    <string name="accessibility_notification_high_contrast_text_action">Open Settings</string>
     <!-- Title for the accessibility preference to high contrast text. [CHAR LIMIT=35] -->
     <string name="accessibility_toggle_maximize_text_contrast_preference_title">Maximize text contrast</string>
     <!-- Summary for the accessibility preference to high contrast text. [CHAR LIMIT=NONE] -->
@@ -8798,13 +8812,13 @@
     <!-- Configure notifications: Value for lockscreen notifications: show all notifications [CHAR LIMIT=60] -->
     <string name="lock_screen_notifs_show_full_list">Full list</string>
 
-    <!-- Configure notifications: Summary for lockscreen notifications: show all notifications [CHAR LIMIT=100] -->
+    <!-- Configure notifications: Summary for lockscreen notifications: show all notifications [CHAR LIMIT=NONE] -->
     <string name="lock_screen_notifs_full_list_desc">The current default placement is a full shelf and notification stack.</string>
 
     <!-- Configure notifications: Value for lockscreen notifications: show compact notifications (minimalism on) [CHAR LIMIT=60] -->
     <string name="lock_screen_notifs_show_compact">Compact</string>
 
-    <!-- Configure notifications: Summary for lockscreen notifications: show compact notifications (minimalism on) [CHAR LIMIT=60] -->
+    <!-- Configure notifications: Summary for lockscreen notifications: show compact notifications (minimalism on) [CHAR LIMIT=NONE] -->
     <string name="lock_screen_notifs_compact_desc">New notifications are collapsed into a shelf on your lockscreen.</string>
 
     <!-- Configure notifications: Title for determining which notifications appear on the lock screen [CHAR LIMIT=60] -->
@@ -8869,16 +8883,16 @@
     <!-- Security > Choose PIN/PW/Pattern > Notification redaction interstitial: Message asking the user how they want their profile notifications to appear when the device is locked [CHAR LIMIT=NONE] -->
     <string name="lock_screen_notifications_interstitial_message_profile">When your device is locked, how do you want profile notifications to show?</string>
 
-    <!-- Notification Settings > Notifications on lock screen > Title for hiding seen notifications toggle. [CHAR LIMIT=30] -->
+    <!-- Notification Settings > Notifications on lock screen > Title for hiding seen notifications toggle. [CHAR LIMIT=60] -->
     <string name="lock_screen_notification_hide_seen_title">Hide seen notifications</string>
 
-    <!-- Notification Settings > Notifications on lock screen > Summary for hiding seen notifications toggle. [CHAR LIMIT=30] -->
+    <!-- Notification Settings > Notifications on lock screen > Summary for hiding seen notifications toggle. [CHAR LIMIT=100] -->
     <string name="lock_screen_notification_hide_seen_summary">Seen notifications are removed from the lock screen.</string>
 
-    <!-- Notification Settings > Notifications on lock screen > Title for hiding silent notifications toggle. [CHAR LIMIT=30] -->
+    <!-- Notification Settings > Notifications on lock screen > Title for hiding silent notifications toggle. [CHAR LIMIT=60] -->
     <string name="lock_screen_notification_hide_silent_title">Hide silent notifications</string>
 
-    <!-- Notification Settings > Notifications on lock screen > Summary for hiding seen notifications toggle. [CHAR LIMIT=30] -->
+    <!-- Notification Settings > Notifications on lock screen > Summary for hiding silent notifications toggle. [CHAR LIMIT=100] -->
     <string name="lock_screen_notification_hide_silent_summary">Silent notifications and conversations are removed from the lock screen.</string>
 
     <!-- Security > Choose PIN/PW/Pattern > Notification redaction interstitial: Title for the screen asking the user how they want their profile notifications to appear when the device is locked [CHAR LIMIT=30] -->
@@ -13916,4 +13930,7 @@
     <string name="search_gesture_feature_title">Circle to Search</string>
     <!-- Summary text for press and hold nav handle OR home button to invoke Circle to Search. [CHAR LIMIT=NONE] -->
     <string name="search_gesture_feature_summary">Touch and hold the Home button or the navigation handle to search using the content on your screen.</string>
+
+    <!-- Content description for device details icon on Connected device page [CHAR LIMIT=NONE] -->
+    <string name="device_detail_icon_content_description"><xliff:g id="device_name">%1$s</xliff:g>. Configure device detail.</string>
 </resources>
diff --git a/res/xml/accessibility_text_reading_options.xml b/res/xml/accessibility_text_reading_options.xml
index 795c4ffb9..8eed107 100644
--- a/res/xml/accessibility_text_reading_options.xml
+++ b/res/xml/accessibility_text_reading_options.xml
@@ -25,7 +25,7 @@
         android:key="preview"
         android:selectable="false"/>
 
-    <com.android.settings.widget.LabeledSeekBarPreference
+    <com.android.settings.accessibility.AccessibilitySeekBarPreference
         android:key="font_size"
         android:summary="@string/short_summary_font_size"
         android:title="@string/title_font_size"
@@ -35,7 +35,7 @@
         settings:iconStartContentDescription="@string/font_size_make_smaller_desc"
         settings:keywords="@string/keywords_font_size" />
 
-    <com.android.settings.widget.LabeledSeekBarPreference
+    <com.android.settings.accessibility.AccessibilitySeekBarPreference
         android:key="display_size"
         android:summary="@string/screen_zoom_short_summary"
         android:title="@string/screen_zoom_title"
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 25bc062..2849238 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -569,6 +569,13 @@
             android:entries="@array/overlay_display_devices_entries"
             android:entryValues="@array/overlay_display_devices_values" />
 
+        <ListPreference
+            android:entries="@array/shade_display_awareness_entries"
+            android:entryValues="@array/shade_display_awareness_values"
+            android:key="shade_display_awareness"
+            android:summary="@string/summary_placeholder"
+            android:title="@string/shade_display_awareness_title" />
+
         <com.android.settings.display.DensityPreference
             android:key="density"
             android:title="@string/developer_smallest_width" />
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index f9f423e..44a195c 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -82,6 +82,17 @@
         </Preference>
 
         <Preference
+            android:key="key_measurement_system"
+            android:title="@string/measurement_system_preferences_title"
+            android:summary="@string/default_string_of_regional_preference"
+            settings:controller="com.android.settings.regionalpreferences.MeasurementSystemController"
+            settings:fragment="com.android.settings.regionalpreferences.MeasurementSystemItemFragment">
+            <extra
+                android:name="arg_key_regional_preference"
+                android:value="ms"/>
+        </Preference>
+
+        <Preference
             android:key="first_day_of_week_preference"
             android:title="@string/first_day_of_week_preferences_title"
             android:summary="@string/default_string_of_regional_preference"
diff --git a/res/xml/regional_preferences_measurement_system.xml b/res/xml/regional_preferences_measurement_system.xml
new file mode 100644
index 0000000..73ac03d
--- /dev/null
+++ b/res/xml/regional_preferences_measurement_system.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 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.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/measurement_system_preferences_title"
+    android:key="regional_preference_measurement_system">
+
+  <com.android.settingslib.widget.TopIntroPreference
+      android:key="measurement_system_intro"
+      android:title="@string/regional_preferences_option_page_sub_title"
+      android:persistent="false" />
+
+  <PreferenceCategory
+      android:key="measurement_system_item_category"
+      android:title="@string/summary_placeholder"
+      android:layout="@layout/preference_category_no_label"
+      settings:controller="com.android.settings.regionalpreferences.MeasurementSystemItemCategoryController"/>
+
+</PreferenceScreen>
diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml
index 83cdf64..9c7f001 100644
--- a/res/xml/system_dashboard_fragment.xml
+++ b/res/xml/system_dashboard_fragment.xml
@@ -47,6 +47,24 @@
         settings:controller="com.android.settings.inputmethod.TouchpadAndMouseSettingsController"/>
 
     <Preference
+        android:key="touchpad_settings"
+        android:title="@string/trackpad_settings"
+        android:summary="@string/trackpad_settings_summary"
+        android:icon="@drawable/ic_settings_trackpad"
+        android:order="-253"
+        android:fragment="com.android.settings.inputmethod.TouchpadSettingFragment"
+        settings:controller="com.android.settings.inputmethod.TouchpadSettingsController"/>
+
+    <Preference
+        android:key="mouse_settings"
+        android:title="@string/mouse_settings"
+        android:summary="@string/mouse_settings_summary"
+        android:icon="@drawable/ic_settings_mouse"
+        android:order="-252"
+        android:fragment="com.android.settings.inputmethod.MouseSettingFragment"
+        settings:controller="com.android.settings.inputmethod.MouseSettingsController"/>
+
+    <Preference
         android:key="gesture_settings"
         android:title="@string/gesture_preference_title"
         android:icon="@drawable/ic_settings_gestures"
diff --git a/src/com/android/settings/accessibility/AccessibilitySeekBarPreference.kt b/src/com/android/settings/accessibility/AccessibilitySeekBarPreference.kt
new file mode 100644
index 0000000..b98c0e2
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilitySeekBarPreference.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2024 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.settings.accessibility
+
+import android.content.Context
+import android.os.Bundle
+import android.os.Parcelable
+import android.util.AttributeSet
+import com.android.settings.widget.LabeledSeekBarPreference
+
+/**
+ * Add a custom AccessibilitySeekBarPreference with tool tip window for font size and display size.
+ */
+open class AccessibilitySeekBarPreference(context: Context, attrs: AttributeSet?) :
+    LabeledSeekBarPreference(context, attrs) {
+
+    var needsQSTooltipReshow = false
+    private var tooltipWindow: AccessibilityQuickSettingsTooltipWindow? = null
+
+    override fun onSaveInstanceState(): Parcelable {
+        val state = Bundle()
+        state.putParcelable(null, super.onSaveInstanceState())
+        if (needsQSTooltipReshow || tooltipWindow?.isShowing == true) {
+            state.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true)
+        }
+        return state
+    }
+
+    override fun onRestoreInstanceState(state: Parcelable?) {
+        val bundle = state as Bundle
+        super.onRestoreInstanceState(bundle.getParcelable(null, Parcelable::class.java))
+        if (bundle.containsKey(KEY_SAVED_QS_TOOLTIP_RESHOW)) {
+            needsQSTooltipReshow = bundle.getBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW)
+        }
+    }
+
+    /** To generate a tooltip window and return it. */
+    fun createTooltipWindow(): AccessibilityQuickSettingsTooltipWindow =
+        AccessibilityQuickSettingsTooltipWindow(context).also { tooltipWindow = it }
+
+    /** To dismiss the tooltip window. */
+    fun dismissTooltip() {
+        val tooltip = tooltipWindow
+        if (tooltip?.isShowing == true) {
+            tooltip.dismiss()
+            tooltipWindow = null
+        }
+    }
+
+    companion object {
+        private const val KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow"
+    }
+}
diff --git a/src/com/android/settings/accessibility/HighContrastTextMigrationReceiver.java b/src/com/android/settings/accessibility/HighContrastTextMigrationReceiver.java
new file mode 100644
index 0000000..ee3537b
--- /dev/null
+++ b/src/com/android/settings/accessibility/HighContrastTextMigrationReceiver.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2024 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.settings.accessibility;
+
+import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import android.annotation.IntDef;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.graphics.hwui.flags.Flags;
+import com.android.settings.R;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Handling smooth migration to the new high contrast text appearance
+ */
+public class HighContrastTextMigrationReceiver extends BroadcastReceiver {
+    private static final String TAG = HighContrastTextMigrationReceiver.class.getSimpleName();
+    @VisibleForTesting
+    static final String NOTIFICATION_CHANNEL = "high_contrast_text_notification_channel";
+    @VisibleForTesting
+    static final String ACTION_RESTORED =
+            "com.android.settings.accessibility.ACTION_HIGH_CONTRAST_TEXT_RESTORED";
+    @VisibleForTesting
+    static final int NOTIFICATION_ID = 1;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            PromptState.UNKNOWN,
+            PromptState.PROMPT_SHOWN,
+            PromptState.PROMPT_UNNECESSARY,
+    })
+    public @interface PromptState {
+        int UNKNOWN = 0;
+        int PROMPT_SHOWN = 1;
+        int PROMPT_UNNECESSARY = 2;
+    }
+
+    @Override
+    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
+        if (!Flags.highContrastTextSmallTextRect()) {
+            return;
+        }
+
+        if (ACTION_RESTORED.equals(intent.getAction())) {
+            Log.i(TAG, "HCT attempted to be restored from backup; showing notification for userId: "
+                    + context.getUserId());
+            Settings.Secure.putInt(context.getContentResolver(),
+                    Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS,
+                    PromptState.PROMPT_SHOWN);
+            showNotification(context);
+        } else if (Intent.ACTION_PRE_BOOT_COMPLETED.equals(intent.getAction())) {
+            final boolean hasSeenPromptIfNecessary = Settings.Secure.getInt(
+                    context.getContentResolver(),
+                    Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS, PromptState.UNKNOWN)
+                    != PromptState.UNKNOWN;
+            if (hasSeenPromptIfNecessary) {
+                Log.i(TAG, "Has seen HCT prompt if necessary; skip HCT migration for userId: "
+                        + context.getUserId());
+                return;
+            }
+
+            final boolean isHctEnabled = Settings.Secure.getInt(context.getContentResolver(),
+                    Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, OFF) == ON;
+            if (isHctEnabled) {
+                Log.i(TAG, "HCT enabled before OTA update; performing migration for userId: "
+                        + context.getUserId());
+                Settings.Secure.putInt(context.getContentResolver(),
+                        Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
+                        OFF);
+                Settings.Secure.putInt(context.getContentResolver(),
+                        Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS,
+                        PromptState.PROMPT_SHOWN);
+                showNotification(context);
+            } else {
+                Log.i(TAG,
+                        "HCT was not enabled before OTA update; not performing migration for "
+                                + "userId: " + context.getUserId());
+                Settings.Secure.putInt(context.getContentResolver(),
+                        Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS,
+                        PromptState.PROMPT_UNNECESSARY);
+            }
+        }
+    }
+
+    private void showNotification(Context context) {
+        Notification.Builder notificationBuilder = new Notification.Builder(context,
+                NOTIFICATION_CHANNEL)
+                .setSmallIcon(R.drawable.ic_settings_24dp)
+                .setContentTitle(context.getString(
+                        R.string.accessibility_toggle_high_text_contrast_preference_title))
+                .setContentText(context.getString(
+                        R.string.accessibility_notification_high_contrast_text_content))
+                .setAutoCancel(true);
+
+        Intent settingsIntent = new Intent(Settings.ACTION_TEXT_READING_SETTINGS);
+        settingsIntent.setPackage(context.getPackageName());
+        if (settingsIntent.resolveActivity(context.getPackageManager()) != null) {
+            Bundle fragmentArgs = new Bundle();
+            fragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY,
+                    TextReadingPreferenceFragment.HIGH_TEXT_CONTRAST_KEY);
+            settingsIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs);
+            PendingIntent settingsPendingIntent = PendingIntent.getActivity(context,
+                    /* requestCode = */ 0, settingsIntent, PendingIntent.FLAG_IMMUTABLE);
+
+            Notification.Action settingsAction = new Notification.Action.Builder(
+                    /* icon= */ null,
+                    context.getString(
+                            R.string.accessibility_notification_high_contrast_text_action),
+                    settingsPendingIntent
+            ).build();
+
+            notificationBuilder.addAction(settingsAction);
+        }
+
+        NotificationManager notificationManager =
+                context.getSystemService(NotificationManager.class);
+        NotificationChannel notificationChannel = new NotificationChannel(
+                NOTIFICATION_CHANNEL,
+                context.getString(
+                        R.string.accessibility_toggle_high_text_contrast_preference_title),
+                NotificationManager.IMPORTANCE_LOW);
+        notificationManager.createNotificationChannel(notificationChannel);
+        notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
+    }
+}
diff --git a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
index 7a3f4f6..c28af91 100644
--- a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
+++ b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
@@ -22,6 +22,7 @@
 import androidx.preference.PreferenceScreen;
 import androidx.preference.TwoStatePreference;
 
+import com.android.graphics.hwui.flags.Flags;
 import com.android.settings.R;
 import com.android.settings.accessibility.TextReadingPreferenceFragment.EntryPoint;
 import com.android.settings.core.TogglePreferenceController;
@@ -60,6 +61,20 @@
                 isChecked ? 1 : 0,
                 AccessibilityStatsLogUtils.convertToEntryPoint(mEntryPoint));
 
+        if (Flags.highContrastTextSmallTextRect()) {
+            // Set PROMPT_UNNECESSARY when the user modifies the HighContrastText setting
+            // This is needed for the following scenario:
+            // On Android 16, create secondary user, ACTION_PRE_BOOT_COMPLETED won't be sent to
+            // the secondary user. The user enables HCT.
+            // When updating OS to Android 17, ACTION_PRE_BOOT_COMPLETED will be sent to the
+            // secondary user when switch to the secondary user.
+            // If the prompt status is not updated in Android 16, we would automatically disable
+            // HCT and show the HCT prompt, which is an undesired behavior.
+            Settings.Secure.putInt(mContext.getContentResolver(),
+                    Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS,
+                    HighContrastTextMigrationReceiver.PromptState.PROMPT_UNNECESSARY);
+        }
+
         return Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, (isChecked ? 1 : 0));
     }
diff --git a/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java b/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java
index 7f10af7..3c62231 100644
--- a/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java
+++ b/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
-import android.os.Bundle;
 import android.os.Handler;
 import android.widget.SeekBar;
 
@@ -28,31 +27,27 @@
 
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.widget.LabeledSeekBarPreference;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnCreate;
 import com.android.settingslib.core.lifecycle.events.OnDestroy;
-import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
 import java.util.Optional;
 
 /**
- * The controller of {@link LabeledSeekBarPreference} that listens to display size and font size
- * settings changes and updates preview size threshold smoothly.
+ * The controller of {@link AccessibilitySeekBarPreference} that listens to display size and font
+ * size settings changes and updates preview size threshold smoothly.
  */
 abstract class PreviewSizeSeekBarController extends BasePreferenceController implements
-        TextReadingResetController.ResetStateListener, LifecycleObserver, OnCreate,
-        OnDestroy, OnSaveInstanceState {
+        TextReadingResetController.ResetStateListener, LifecycleObserver, OnStart, OnStop,
+        OnDestroy {
     private final PreviewSizeData<? extends Number> mSizeData;
-    private static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
     private boolean mSeekByTouch;
     private Optional<ProgressInteractionListener> mInteractionListener = Optional.empty();
-    private LabeledSeekBarPreference mSeekBarPreference;
+    private AccessibilitySeekBarPreference mSeekBarPreference;
     private int mLastProgress;
-    private boolean mNeedsQSTooltipReshow = false;
-    private AccessibilityQuickSettingsTooltipWindow mTooltipWindow;
     private final Handler mHandler;
 
     private String[] mStateLabels = null;
@@ -101,30 +96,21 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        // Restore the tooltip.
-        if (savedInstanceState != null
-                && savedInstanceState.containsKey(KEY_SAVED_QS_TOOLTIP_RESHOW)) {
-            mNeedsQSTooltipReshow = savedInstanceState.getBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW);
+    public void onStart() {
+        if (mSeekBarPreference.getNeedsQSTooltipReshow()) {
+            mHandler.post(this::showQuickSettingsTooltipIfNeeded);
         }
     }
 
     @Override
+    public void onStop() {
+        // all the messages/callbacks will be removed.
+        mHandler.removeCallbacksAndMessages(null);
+    }
+
+    @Override
     public void onDestroy() {
-        // remove runnables in the queue.
-        mHandler.removeCallbacksAndMessages(null);
-        final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing();
-        if (isTooltipWindowShowing) {
-            mTooltipWindow.dismiss();
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing();
-        if (mNeedsQSTooltipReshow || isTooltipWindowShowing) {
-            outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true);
-        }
+        mSeekBarPreference.dismissTooltip();
     }
 
     void setInteractionListener(ProgressInteractionListener interactionListener) {
@@ -148,9 +134,6 @@
         mSeekBarPreference.setProgress(initialIndex);
         mSeekBarPreference.setContinuousUpdates(true);
         mSeekBarPreference.setOnSeekBarChangeListener(mSeekBarChangeListener);
-        if (mNeedsQSTooltipReshow) {
-            mHandler.post(this::showQuickSettingsTooltipIfNeeded);
-        }
         setSeekbarStateDescription(mSeekBarPreference.getProgress());
     }
 
@@ -216,7 +199,8 @@
             return;
         }
 
-        if (!mNeedsQSTooltipReshow && AccessibilityQuickSettingUtils.hasValueInSharedPreferences(
+        if (!mSeekBarPreference.getNeedsQSTooltipReshow()
+                && AccessibilityQuickSettingUtils.hasValueInSharedPreferences(
                 mContext, tileComponentName)) {
             // Returns if quick settings tooltip only show once.
             return;
@@ -228,14 +212,15 @@
         // is not ready when we would like to show the tooltip.  If the seekbar is not ready,
         // we give up showing the tooltip and also do not reshow it in the future.
         if (mSeekBarPreference.getSeekbar() != null) {
-            mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(mContext);
-            mTooltipWindow.setup(getTileTooltipContent(),
+            final AccessibilityQuickSettingsTooltipWindow tooltipWindow =
+                    mSeekBarPreference.createTooltipWindow();
+            tooltipWindow.setup(getTileTooltipContent(),
                     R.drawable.accessibility_auto_added_qs_tooltip_illustration);
-            mTooltipWindow.showAtTopCenter(mSeekBarPreference.getSeekbar());
+            tooltipWindow.showAtTopCenter(mSeekBarPreference.getSeekbar());
         }
         AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext,
                 tileComponentName);
-        mNeedsQSTooltipReshow = false;
+        mSeekBarPreference.setNeedsQSTooltipReshow(false);
     }
 
     /** Returns the accessibility Quick Settings tile component name. */
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewController.java b/src/com/android/settings/accessibility/TextReadingPreviewController.java
index a983105..99f1f3f 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewController.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewController.java
@@ -33,7 +33,6 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.instrumentation.SettingsStatsLog;
 import com.android.settings.display.PreviewPagerAdapter;
-import com.android.settings.widget.LabeledSeekBarPreference;
 
 import java.util.Objects;
 
@@ -58,8 +57,8 @@
     private int mLastDisplayProgress;
     private long mLastCommitTime;
     private TextReadingPreviewPreference mPreviewPreference;
-    private LabeledSeekBarPreference mFontSizePreference;
-    private LabeledSeekBarPreference mDisplaySizePreference;
+    private AccessibilitySeekBarPreference mFontSizePreference;
+    private AccessibilitySeekBarPreference mDisplaySizePreference;
 
     @EntryPoint
     private int mEntryPoint;
diff --git a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
index 14f55b8..bd160e1 100644
--- a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
@@ -39,6 +39,7 @@
 
     private final AudioManager mAudioManager;
     private final LocalBluetoothManager mLocalBtManager;
+    private int mAudioMode;
 
     public AvailableMediaBluetoothDeviceUpdater(
             Context context,
@@ -47,21 +48,23 @@
         super(context, devicePreferenceCallback, metricsCategory);
         mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
         mLocalBtManager = Utils.getLocalBtManager(context);
+        mAudioMode = mAudioManager.getMode();
     }
 
     @Override
     public void onAudioModeChanged() {
+        // TODO: move to background thread
+        mAudioMode = mAudioManager.getMode();
         forceUpdate();
     }
 
     @Override
     public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
-        final int audioMode = mAudioManager.getMode();
         final int currentAudioProfile;
 
-        if (audioMode == AudioManager.MODE_RINGTONE
-                || audioMode == AudioManager.MODE_IN_CALL
-                || audioMode == AudioManager.MODE_IN_COMMUNICATION) {
+        if (mAudioMode == AudioManager.MODE_RINGTONE
+                || mAudioMode == AudioManager.MODE_IN_CALL
+                || mAudioMode == AudioManager.MODE_IN_COMMUNICATION) {
             // in phone call
             currentAudioProfile = BluetoothProfile.HEADSET;
         } else {
diff --git a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
index 2107569..7cc874c 100644
--- a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
@@ -39,26 +39,29 @@
     private static final String PREF_KEY_PREFIX = "connected_bt_";
 
     private final AudioManager mAudioManager;
+    private int mAudioMode;
 
     public ConnectedBluetoothDeviceUpdater(Context context,
             DevicePreferenceCallback devicePreferenceCallback, int metricsCategory) {
         super(context, devicePreferenceCallback, metricsCategory);
         mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+        mAudioMode = mAudioManager.getMode();
     }
 
     @Override
     public void onAudioModeChanged() {
+        // TODO: move to background thread
+        mAudioMode = mAudioManager.getMode();
         forceUpdate();
     }
 
     @Override
     public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
-        final int audioMode = mAudioManager.getMode();
         final int currentAudioProfile;
 
-        if (audioMode == AudioManager.MODE_RINGTONE
-                || audioMode == AudioManager.MODE_IN_CALL
-                || audioMode == AudioManager.MODE_IN_COMMUNICATION) {
+        if (mAudioMode == AudioManager.MODE_RINGTONE
+                || mAudioMode == AudioManager.MODE_IN_CALL
+                || mAudioMode == AudioManager.MODE_IN_COMMUNICATION) {
             // in phone call
             currentAudioProfile = BluetoothProfile.HEADSET;
         } else {
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsHelper.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsHelper.java
index 25a9135..c86222c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsHelper.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsHelper.java
@@ -21,6 +21,8 @@
 import static com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamMediaService.DEVICES;
 
 import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+import static java.util.stream.Collectors.toMap;
 
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothLeAudioContentMetadata;
@@ -48,7 +50,9 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.function.Function;
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
@@ -149,6 +153,16 @@
                 .toList();
     }
 
+    /** Retrieves a list of all LE broadcast receive states keyed by each active device. */
+    public Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> getAllSourcesByDevice() {
+        if (mLeBroadcastAssistant == null) {
+            Log.w(TAG, "getAllSourcesByDevice(): LeBroadcastAssistant is null!");
+            return emptyMap();
+        }
+        return getConnectedBluetoothDevices(mBluetoothManager, /* inSharingOnly= */ true).stream()
+                .collect(toMap(Function.identity(), mLeBroadcastAssistant::getAllSources));
+    }
+
     /** Retrieves a list of all LE broadcast receive states from sinks with source present. */
     @VisibleForTesting
     public List<BluetoothLeBroadcastReceiveState> getAllPresentSources() {
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallback.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallback.java
index f003431..87cea2c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallback.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallback.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.connecteddevice.audiosharing.audiostreams;
 
-
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothLeBroadcastMetadata;
 import android.bluetooth.BluetoothLeBroadcastReceiveState;
@@ -43,13 +42,13 @@
         super.onReceiveStateChanged(sink, sourceId, state);
 
         if (AudioStreamsHelper.isConnected(state)) {
-            mCategoryController.handleSourceConnected(state);
+            mCategoryController.handleSourceConnected(sink, state);
         } else if (AudioStreamsHelper.isBadCode(state)) {
             mCategoryController.handleSourceConnectBadCode(state);
         } else if (BluetoothUtils.isAudioSharingHysteresisModeFixAvailable(mContext)
                 && AudioStreamsHelper.hasSourcePresent(state)) {
             // Keep this check as the last, source might also present in above states
-            mCategoryController.handleSourcePresent(state);
+            mCategoryController.handleSourcePresent(sink, state);
         }
     }
 
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryController.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryController.java
index f0a0c5b..6831c5a 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryController.java
@@ -17,10 +17,12 @@
 package com.android.settings.connecteddevice.audiosharing.audiostreams;
 
 import static java.util.Collections.emptyList;
+import static java.util.stream.Collectors.toMap;
 
 import android.app.AlertDialog;
 import android.app.settings.SettingsEnums;
 import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothLeBroadcastMetadata;
 import android.bluetooth.BluetoothLeBroadcastReceiveState;
 import android.bluetooth.BluetoothProfile;
@@ -49,6 +51,8 @@
 
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -391,34 +395,19 @@
     // Expect one of the following:
     // 1) No preference existed, create new preference with state SOURCE_ADDED
     // 2) Any other state, move to SOURCE_ADDED
-    void handleSourceConnected(BluetoothLeBroadcastReceiveState receiveState) {
+    void handleSourceConnected(
+            BluetoothDevice device, BluetoothLeBroadcastReceiveState receiveState) {
         if (DEBUG) {
             Log.d(TAG, "handleSourceConnected()");
         }
         if (!AudioStreamsHelper.isConnected(receiveState)) {
             return;
         }
-
         var broadcastIdConnected = receiveState.getBroadcastId();
-        if (mSourceFromQrCode != null && mSourceFromQrCode.getBroadcastId() == UNSET_BROADCAST_ID) {
-            // mSourceFromQrCode could have no broadcast Id, we fill in the broadcast Id from the
-            // connected source receiveState.
-            if (DEBUG) {
-                Log.d(
-                        TAG,
-                        "handleSourceConnected() : processing mSourceFromQrCode with broadcastId"
-                                + " unset");
-            }
-            boolean updated =
-                    maybeUpdateId(
-                            AudioStreamsHelper.getBroadcastName(receiveState),
-                            receiveState.getBroadcastId());
-            if (updated && mBroadcastIdToPreferenceMap.containsKey(UNSET_BROADCAST_ID)) {
-                var preference = mBroadcastIdToPreferenceMap.remove(UNSET_BROADCAST_ID);
-                mBroadcastIdToPreferenceMap.put(receiveState.getBroadcastId(), preference);
-            }
-        }
-
+        Optional<BluetoothLeBroadcastMetadata> metadata =
+                getMetadataMatchingByBroadcastId(
+                        device, receiveState.getSourceId(), broadcastIdConnected);
+        handleQrCodeWithUnsetBroadcastIdIfNeeded(metadata, receiveState);
         mBroadcastIdToPreferenceMap.compute(
                 broadcastIdConnected,
                 (k, existingPreference) -> {
@@ -428,7 +417,12 @@
                         // we retrieves the connected source during onStart() from
                         // AudioStreamsHelper#getAllConnectedSources() even before the source is
                         // founded by scanning.
-                        return addNewPreference(receiveState, AudioStreamState.SOURCE_ADDED);
+                        return metadata.isPresent()
+                                ? addNewPreference(
+                                        metadata.get(),
+                                        AudioStreamState.SOURCE_ADDED,
+                                        SourceOriginForLogging.UNKNOWN)
+                                : addNewPreference(receiveState, AudioStreamState.SOURCE_ADDED);
                     }
                     if (existingPreference.getAudioStreamState() == AudioStreamState.WAIT_FOR_SYNC
                             && existingPreference.getAudioStreamBroadcastId() == UNSET_BROADCAST_ID
@@ -473,7 +467,8 @@
 
     // Find preference by receiveState and decide next state.
     // Expect one preference existed, move to SOURCE_PRESENT
-    void handleSourcePresent(BluetoothLeBroadcastReceiveState receiveState) {
+    void handleSourcePresent(
+            BluetoothDevice device, BluetoothLeBroadcastReceiveState receiveState) {
         if (DEBUG) {
             Log.d(TAG, "handleSourcePresent()");
         }
@@ -482,25 +477,10 @@
         }
 
         var broadcastIdConnected = receiveState.getBroadcastId();
-        if (mSourceFromQrCode != null && mSourceFromQrCode.getBroadcastId() == UNSET_BROADCAST_ID) {
-            // mSourceFromQrCode could have no broadcast Id, we fill in the broadcast Id from the
-            // connected source receiveState.
-            if (DEBUG) {
-                Log.d(
-                        TAG,
-                        "handleSourcePresent() : processing mSourceFromQrCode with broadcastId"
-                                + " unset");
-            }
-            boolean updated =
-                    maybeUpdateId(
-                            AudioStreamsHelper.getBroadcastName(receiveState),
-                            receiveState.getBroadcastId());
-            if (updated && mBroadcastIdToPreferenceMap.containsKey(UNSET_BROADCAST_ID)) {
-                var preference = mBroadcastIdToPreferenceMap.remove(UNSET_BROADCAST_ID);
-                mBroadcastIdToPreferenceMap.put(receiveState.getBroadcastId(), preference);
-            }
-        }
-
+        Optional<BluetoothLeBroadcastMetadata> metadata =
+                getMetadataMatchingByBroadcastId(
+                        device, receiveState.getSourceId(), broadcastIdConnected);
+        handleQrCodeWithUnsetBroadcastIdIfNeeded(metadata, receiveState);
         mBroadcastIdToPreferenceMap.compute(
                 broadcastIdConnected,
                 (k, existingPreference) -> {
@@ -511,7 +491,12 @@
                         // we retrieves the connected source during onStart() from
                         // AudioStreamsHelper#getAllPresentSources() even before the source is
                         // founded by scanning.
-                        return addNewPreference(receiveState, AudioStreamState.SOURCE_PRESENT);
+                        return metadata.isPresent()
+                                ? addNewPreference(
+                                        metadata.get(),
+                                        AudioStreamState.SOURCE_PRESENT,
+                                        SourceOriginForLogging.UNKNOWN)
+                                : addNewPreference(receiveState, AudioStreamState.SOURCE_PRESENT);
                     }
                     if (existingPreference.getAudioStreamState() == AudioStreamState.WAIT_FOR_SYNC
                             && existingPreference.getAudioStreamBroadcastId() == UNSET_BROADCAST_ID
@@ -598,28 +583,85 @@
                     // Handle QR code scan, display currently connected streams then start scanning
                     // sequentially
                     handleSourceFromQrCodeIfExists();
+                    Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> sources =
+                            mAudioStreamsHelper.getAllSourcesByDevice();
+                    Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> connectedSources =
+                            getConnectedSources(sources);
                     if (isAudioSharingHysteresisModeFixAvailable(mContext)) {
                         // With hysteresis mode, we prioritize showing connected sources first.
                         // If no connected sources are found, we then show present sources.
-                        List<BluetoothLeBroadcastReceiveState> sources =
-                                mAudioStreamsHelper.getAllConnectedSources();
-                        if (!sources.isEmpty()) {
-                            sources.forEach(this::handleSourceConnected);
+                        if (!connectedSources.isEmpty()) {
+                            connectedSources.forEach(
+                                    (device, stateList) ->
+                                            stateList.forEach(
+                                                    state -> handleSourceConnected(device, state)));
                         } else {
-                            mAudioStreamsHelper
-                                    .getAllPresentSources()
-                                    .forEach(this::handleSourcePresent);
+                            Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>>
+                                    presentSources = getPresentSources(sources);
+                            presentSources.forEach(
+                                    (device, stateList) ->
+                                            stateList.forEach(
+                                                    state -> handleSourcePresent(device, state)));
                         }
                     } else {
-                        mAudioStreamsHelper
-                                .getAllConnectedSources()
-                                .forEach(this::handleSourceConnected);
+                        connectedSources.forEach(
+                                (device, stateList) ->
+                                        stateList.forEach(
+                                                state -> handleSourceConnected(device, state)));
                     }
                     mLeBroadcastAssistant.startSearchingForSources(emptyList());
                     mMediaControlHelper.start();
                 });
     }
 
+    private Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> getConnectedSources(
+            Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> sources) {
+        return sources.entrySet().stream()
+                .filter(
+                        entry ->
+                                entry.getValue().stream().anyMatch(AudioStreamsHelper::isConnected))
+                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    private Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> getPresentSources(
+            Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> sources) {
+        return sources.entrySet().stream()
+                .filter(
+                        entry ->
+                                entry.getValue().stream()
+                                        .anyMatch(AudioStreamsHelper::hasSourcePresent))
+                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    private Optional<BluetoothLeBroadcastMetadata> getMetadataMatchingByBroadcastId(
+            BluetoothDevice device, int sourceId, int broadcastId) {
+        return Optional.ofNullable(
+                        mLeBroadcastAssistant != null
+                                ? mLeBroadcastAssistant.getSourceMetadata(device, sourceId)
+                                : null)
+                .filter(m -> m.getBroadcastId() == broadcastId);
+    }
+
+    private void handleQrCodeWithUnsetBroadcastIdIfNeeded(
+            Optional<BluetoothLeBroadcastMetadata> metadata,
+            BluetoothLeBroadcastReceiveState receiveState) {
+        if (mSourceFromQrCode != null && mSourceFromQrCode.getBroadcastId() == UNSET_BROADCAST_ID) {
+            if (DEBUG) {
+                Log.d(TAG, "Processing mSourceFromQrCode with unset broadcastId");
+            }
+            boolean updated =
+                    maybeUpdateId(
+                            metadata.isPresent()
+                                    ? AudioStreamsHelper.getBroadcastName(metadata.get())
+                                    : AudioStreamsHelper.getBroadcastName(receiveState),
+                            receiveState.getBroadcastId());
+            if (updated && mBroadcastIdToPreferenceMap.containsKey(UNSET_BROADCAST_ID)) {
+                var preference = mBroadcastIdToPreferenceMap.remove(UNSET_BROADCAST_ID);
+                mBroadcastIdToPreferenceMap.put(receiveState.getBroadcastId(), preference);
+            }
+        }
+    }
+
     private void stopScanning() {
         if (mLeBroadcastAssistant == null) {
             Log.w(TAG, "stopScanning(): LeBroadcastAssistant is null!");
diff --git a/src/com/android/settings/connecteddevice/display/DisplayTopology.kt b/src/com/android/settings/connecteddevice/display/DisplayTopology.kt
index 162d9d2..76abc03 100644
--- a/src/com/android/settings/connecteddevice/display/DisplayTopology.kt
+++ b/src/com/android/settings/connecteddevice/display/DisplayTopology.kt
@@ -41,8 +41,20 @@
  * left corner of the pane. It uses a scale optimized for showing all displays with minimal or no
  * scrolling. The display coordinates are floating point and the origin can be in any position. In
  * practice the origin will be the upper-left coordinate of the primary display.
+ *
+ * @param paneWidth width of the pane in view coordinates
+ * @param minEdgeLength the smallest length permitted of a display block. This should be set based
+ *                      on accessibility requirements, but also accounting for padding that appears
+ *                      around each button.
+ * @param maxBlockRatio the highest allowed ratio of block size to display size. For instance, a
+ *                      value of 0.05 means the block will at most be 1/20 the size of the display
+ *                      it represents. This limit may be breached to account for minEdgeLength,
+ *                      which is considered an a11y requirement.
+ * @param displaysPos the absolute topology coordinates for each display in the topology.
  */
-class TopologyScale(paneWidth : Int, displaysPos : Collection<RectF>) {
+class TopologyScale(
+        paneWidth : Int, minEdgeLength : Int, maxBlockRatio : Float,
+        displaysPos : Collection<RectF>) {
     /** Scale of block sizes to real-world display sizes. Should be less than 1. */
     val blockRatio : Float
 
@@ -69,16 +81,14 @@
             biggestDisplayHeight = max(biggestDisplayHeight, pos.height())
         }
 
-        // Set height according to the width and the aspect ratio of the display bounds.
-        // 0.05 is a reasonable limit to the size of display blocks. It appears to match the
-        // ratio used in the ChromeOS topology editor. It prevents blocks from being too large,
-        // which would make dragging and dropping awkward.
-        val rawBlockRatio = min(0.05, paneWidth.toDouble() * 0.6 / displayBounds.width())
+        // Set height according to the width and the aspect ratio of the display bounds limitted by
+        // maxBlockRatio. It prevents blocks from being too large, which would make dragging and
+        // dropping awkward.
+        val rawBlockRatio = min(maxBlockRatio, paneWidth.toFloat() * 0.6f / displayBounds.width())
 
         // If the `ratio` is set too low because one of the displays will have an edge less than
-        // 48dp long, increase it such that the smallest edge is that long. This may override the
-        // 0.05 limit since it is more important than it.
-        blockRatio = max(48.0 / smallestDisplayDim, rawBlockRatio).toFloat()
+        // minEdgeLength(dp) long, increase it such that the smallest edge is that long.
+        blockRatio = max(minEdgeLength.toFloat() / smallestDisplayDim, rawBlockRatio).toFloat()
 
         // Essentially, we just set the pane height based on the pre-determined pane width and the
         // aspect ratio of the display bounds. But we may need to increase it slightly to achieve
@@ -99,9 +109,9 @@
         // such that the display bounds rect is centered in the pane.
         // It is unlikely that either of these coordinates will be negative since blockRatio has
         // been chosen to allow 20% padding around each side of the display blocks. However, the
-        // a11y requirement applied above (48.0 / smallestDisplayDim) may cause the blocks to not
-        // fit. This should be rare in practice, and can be worked around by moving the settings UI
-        // to a larger display.
+        // a11y requirement applied above (minEdgeLength / smallestDisplayDim) may cause the blocks
+        // to not fit. This should be rare in practice, and can be worked around by moving the
+        // settings UI to a larger display.
         val blockMostLeft = (paneWidth - displayBounds.width() * blockRatio) / 2
         val blockMostTop = (paneHeight - displayBounds.height() * blockRatio) / 2
 
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 9c13794..605f3bb 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -837,6 +837,7 @@
         controllers.add(new ForceEnableNotesRolePreferenceController(context));
         controllers.add(new GrammaticalGenderPreferenceController(context));
         controllers.add(new SensitiveContentProtectionPreferenceController(context));
+        controllers.add(new ShadeDisplayAwarenessPreferenceController(context));
 
         return controllers;
     }
diff --git a/src/com/android/settings/development/ShadeDisplayAwarenessPreferenceController.java b/src/com/android/settings/development/ShadeDisplayAwarenessPreferenceController.java
new file mode 100644
index 0000000..0551112
--- /dev/null
+++ b/src/com/android/settings/development/ShadeDisplayAwarenessPreferenceController.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2024 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.settings.development;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.R;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class ShadeDisplayAwarenessPreferenceController extends DeveloperOptionsPreferenceController
+        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin,
+        RebootConfirmationDialogHost {
+
+    private static final int SHADE_DISPLAY_AWARENESS_DEFAULT = 0;
+    private static final String SHADE_DISPLAY_AWARENESS_KEY = "shade_display_awareness";
+
+    private final String[] mListValues;
+    private final String[] mListSummaries;
+
+    public ShadeDisplayAwarenessPreferenceController(Context context) {
+        super(context);
+
+        mListValues = mContext.getResources().getStringArray(
+                R.array.shade_display_awareness_values);
+        mListSummaries = mContext.getResources().getStringArray(
+                R.array.shade_display_awareness_summaries);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return SHADE_DISPLAY_AWARENESS_KEY;
+    }
+
+    @Override
+    public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SHADE_DISPLAY_AWARENESS, newValue.toString());
+        updateShadeDisplayAwareness((ListPreference) mPreference);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        updateShadeDisplayAwareness((ListPreference) mPreference);
+    }
+
+    private void updateShadeDisplayAwareness(ListPreference preference) {
+        String currentValue = Settings.Global.getString(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SHADE_DISPLAY_AWARENESS);
+        int index = SHADE_DISPLAY_AWARENESS_DEFAULT; // Defaults to value is device-display (0)
+        for (int i = 0; i < mListValues.length; i++) {
+            if (TextUtils.equals(currentValue, mListValues[i])) {
+                index = i;
+                break;
+            }
+        }
+        preference.setValue(mListValues[index]);
+        preference.setSummary(mListSummaries[index]);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        super.onDeveloperOptionsSwitchDisabled();
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SHADE_DISPLAY_AWARENESS,
+                mListValues[SHADE_DISPLAY_AWARENESS_DEFAULT]);
+    }
+}
diff --git a/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsController.java b/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsController.java
index 86e044c..163027b 100644
--- a/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsController.java
+++ b/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsController.java
@@ -26,6 +26,7 @@
 
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.keyboard.Flags;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -85,13 +86,15 @@
 
     @Override
     public int getAvailabilityStatus() {
+        boolean isNewPageFlagDisabled = !Flags.keyboardAndTouchpadA11yNewPageEnabled();
         boolean isFeatureOn = FeatureFlagUtils
                 .isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_TRACKPAD);
         boolean isTouchpad = InputPeripheralsSettingsUtils.isTouchpad();
         boolean isPointerCustomizationEnabled =
                 android.view.flags.Flags.enableVectorCursorA11ySettings();
         boolean isMouse = InputPeripheralsSettingsUtils.isMouse();
-        return (isFeatureOn && isTouchpad) || (isPointerCustomizationEnabled && isMouse) ? AVAILABLE
+        return ((isFeatureOn && isTouchpad) || (isPointerCustomizationEnabled && isMouse))
+                && isNewPageFlagDisabled ? AVAILABLE
                 : CONDITIONALLY_UNAVAILABLE;
     }
 }
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index c776987..1fc9101 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -706,7 +706,7 @@
                 forget(mSelectedWifiEntry);
                 return true;
             case MENU_ID_SHARE:
-                WifiDppUtils.showLockScreen(getContext(),
+                WifiDppUtils.showLockScreenForWifiSharing(getContext(),
                         () -> launchWifiDppConfiguratorActivity(mSelectedWifiEntry));
                 return true;
             case MENU_ID_MODIFY:
diff --git a/src/com/android/settings/network/OWNERS b/src/com/android/settings/network/OWNERS
index a63a825..ad3c9da 100644
--- a/src/com/android/settings/network/OWNERS
+++ b/src/com/android/settings/network/OWNERS
@@ -1,12 +1,8 @@
 # Default reviewers for this and subdirectories.
-allenwtsu@google.com
-andychou@google.com
-bonianchen@google.com
-changbetty@google.com
-leechou@google.com
+chaohuiw@google.com
+evanwu@google.com
 songferngwang@google.com
 tomhsu@google.com
 wengsu@google.com
-zoeychen@google.com
 
 # Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/regionalpreferences/ExtensionTypes.java b/src/com/android/settings/regionalpreferences/ExtensionTypes.java
index b860d29..5a2057b 100644
--- a/src/com/android/settings/regionalpreferences/ExtensionTypes.java
+++ b/src/com/android/settings/regionalpreferences/ExtensionTypes.java
@@ -25,12 +25,14 @@
     public static final String FIRST_DAY_OF_WEEK = "fw";
     public static final String NUMBERING_SYSTEM = "nu";
     public static final String TEMPERATURE_UNIT = "mu";
+    public static final String MEASUREMENT_SYSTEM = "ms";
 
     @StringDef({
             FIRST_DAY_OF_WEEK,
             CALENDAR,
             TEMPERATURE_UNIT,
-            NUMBERING_SYSTEM
+            NUMBERING_SYSTEM,
+            MEASUREMENT_SYSTEM
     })
     public @interface Values {}
 }
diff --git a/src/com/android/settings/regionalpreferences/MeasurementSystemController.java b/src/com/android/settings/regionalpreferences/MeasurementSystemController.java
new file mode 100644
index 0000000..1b6daaf
--- /dev/null
+++ b/src/com/android/settings/regionalpreferences/MeasurementSystemController.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (C) 2024 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.settings.regionalpreferences;
+
+import android.content.Context;
+import android.os.LocaleList;
+
+import androidx.annotation.NonNull;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.flags.Flags;
+
+import java.util.Locale;
+
+/** A controller for the entry of measurement system page */
+public class MeasurementSystemController extends BasePreferenceController {
+    private static final String TAG = "MeasurementSystemController";
+    public MeasurementSystemController(@NonNull Context context, @NonNull String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        if (Flags.regionalPreferencesApiEnabled()) {
+            return AVAILABLE;
+        }
+        return CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    @NonNull
+    public CharSequence getSummary() {
+        LocaleList localeList = LocaleList.getDefault();
+        Locale locale = localeList.get(0);
+        return getMeasurementSystem(locale);
+    }
+
+    private String getMeasurementSystem(Locale locale) {
+        String type = locale.getUnicodeLocaleType(
+                RegionalPreferencesDataUtils.EXTENSION_TYPE_MEASUREMENT_SYSTEM);
+        if (type != null) {
+            if (type.equals(RegionalPreferencesDataUtils.MEASUREMENT_SYSTEM_METRIC)) {
+                return mContext.getString(R.string.metric_measurement_system);
+            }
+            if (type.equals(RegionalPreferencesDataUtils.MEASUREMENT_SYSTEM_UK)) {
+                return mContext.getString(R.string.uk_measurement_system);
+            }
+            return mContext.getString(R.string.us_measurement_system);
+        } else {
+            return mContext.getString(R.string.default_string_of_regional_preference);
+        }
+    }
+}
diff --git a/src/com/android/settings/regionalpreferences/MeasurementSystemItemCategoryController.java b/src/com/android/settings/regionalpreferences/MeasurementSystemItemCategoryController.java
new file mode 100644
index 0000000..03b8817
--- /dev/null
+++ b/src/com/android/settings/regionalpreferences/MeasurementSystemItemCategoryController.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (C) 2024 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.settings.regionalpreferences;
+
+import android.content.Context;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.widget.PreferenceCategoryController;
+
+/** Category preference controller for measurement system preferences. */
+public class MeasurementSystemItemCategoryController extends PreferenceCategoryController {
+
+    private static final String LOG_TAG = "MeasurementSystemItemCategoryController";
+    private static final String KEY_PREFERENCE_CATEGORY_MEASUREMENT_SYSTEM_ITEM =
+            "measurement_system_item_category";
+    private static final String KEY_PREFERENCE_MEASUREMENT_SYSTEM_ITEM =
+            "measurement_system_item_list";
+
+    public MeasurementSystemItemCategoryController(@NonNull Context context, @NonNull String key) {
+        super(context, key);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(@NonNull PreferenceScreen screen) {
+        super.displayPreference(screen);
+        PreferenceCategory preferenceCategory =
+                screen.findPreference(KEY_PREFERENCE_CATEGORY_MEASUREMENT_SYSTEM_ITEM);
+        if (preferenceCategory == null) {
+            Log.d(LOG_TAG, "displayPreference(), Can not find the category.");
+            return;
+        }
+        preferenceCategory.setVisible(isAvailable());
+        MeasurementSystemItemListController measurementSystemItemListController =
+                new MeasurementSystemItemListController(
+                    mContext,
+                    KEY_PREFERENCE_MEASUREMENT_SYSTEM_ITEM);
+        measurementSystemItemListController.displayPreference(screen);
+    }
+}
diff --git a/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java b/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java
new file mode 100644
index 0000000..9f15cf4
--- /dev/null
+++ b/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (C) 2024 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.settings.regionalpreferences;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.flags.Flags;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.search.SearchIndexable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Main fragment to display measurement system. */
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
+public class MeasurementSystemItemFragment extends DashboardFragment {
+
+    private static final String LOG_TAG = "MeasurementSystemItemFragment";
+    private static final String KEY_PREFERENCE_CATEGORY_MEASUREMENT_SYSTEM_ITEM =
+            "measurement_system_item_category";
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.regional_preferences_measurement_system;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.MEASUREMENT_SYSTEM_PREFERENCE;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return LOG_TAG;
+    }
+
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new MeasurementSystemItemCategoryController(context,
+                KEY_PREFERENCE_CATEGORY_MEASUREMENT_SYSTEM_ITEM));
+        return controllers;
+    }
+
+    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider(R.xml.regional_preferences_measurement_system) {
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    if (Flags.regionalPreferencesApiEnabled()) {
+                        return false;
+                    }
+                    return true;
+                }
+            };
+}
diff --git a/src/com/android/settings/regionalpreferences/MeasurementSystemItemListController.java b/src/com/android/settings/regionalpreferences/MeasurementSystemItemListController.java
new file mode 100644
index 0000000..061c4f8
--- /dev/null
+++ b/src/com/android/settings/regionalpreferences/MeasurementSystemItemListController.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (C) 2024 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.settings.regionalpreferences;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.android.settings.R;
+
+/** A controller for handling all measurement system preferences. */
+public class MeasurementSystemItemListController extends
+        RegionalPreferenceListBasePreferenceController {
+
+    private static final String KEY_PREFERENCE_CATEGORY_MEASUREMENT_SYSTEM_ITEM =
+            "measurement_system_item_category";
+    private static final String KEY_PREFERENCE_MEASUREMENT_SYSTEM_ITEM =
+            "measurement_system_item_list";
+
+    public MeasurementSystemItemListController(@NonNull Context context, @NonNull String key) {
+        super(context, key);
+    }
+
+    @Override
+    protected String getPreferenceTitle(String item) {
+        return RegionalPreferencesDataUtils.measurementSystemConverter(mContext, item);
+    }
+
+    @Override
+    protected String getPreferenceCategoryKey() {
+        return KEY_PREFERENCE_CATEGORY_MEASUREMENT_SYSTEM_ITEM;
+    }
+
+    @Override
+    @NonNull
+    public String getPreferenceKey() {
+        return KEY_PREFERENCE_MEASUREMENT_SYSTEM_ITEM;
+    }
+
+    @Override
+    protected String getExtensionTypes() {
+        return ExtensionTypes.MEASUREMENT_SYSTEM;
+    }
+
+    @Override
+    protected String[] getUnitValues() {
+        return mContext.getResources().getStringArray(R.array.measurement_system);
+    }
+
+    @Override
+    protected int getMetricsActionKey() {
+        return SettingsEnums.ACTION_SET_MEASUREMENT_SYSTEM;
+    }
+}
diff --git a/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java b/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
index dda0579..606307f 100644
--- a/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
+++ b/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
@@ -65,8 +65,8 @@
                 RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(),
                         item.equals(RegionalPreferencesDataUtils.DEFAULT_VALUE)
                                 ? null : item);
-                String metrics =
-                        getMetricsActionKey() == SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK ? ""
+                String metrics = shouldUseEmptyMetrics()
+                                ? ""
                                 : getPreferenceTitle(value) + " > " + getPreferenceTitle(item);
                 mMetricsFeatureProvider.action(mContext, getMetricsActionKey(), metrics);
             });
@@ -79,6 +79,14 @@
         return AVAILABLE;
     }
 
+    private boolean shouldUseEmptyMetrics() {
+        if (getMetricsActionKey() == SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK
+                || getMetricsActionKey() == SettingsEnums.ACTION_SET_MEASUREMENT_SYSTEM) {
+            return true;
+        }
+        return false;
+    }
+
     protected abstract String getPreferenceTitle(String item);
 
     protected abstract String getPreferenceCategoryKey();
diff --git a/src/com/android/settings/regionalpreferences/RegionalPreferencesDataUtils.java b/src/com/android/settings/regionalpreferences/RegionalPreferencesDataUtils.java
index d1ae40b..669bcdd 100644
--- a/src/com/android/settings/regionalpreferences/RegionalPreferencesDataUtils.java
+++ b/src/com/android/settings/regionalpreferences/RegionalPreferencesDataUtils.java
@@ -17,6 +17,7 @@
 package com.android.settings.regionalpreferences;
 
 import android.content.Context;
+import android.icu.util.LocaleData;
 import android.icu.util.ULocale;
 import android.os.LocaleList;
 import android.provider.Settings;
@@ -32,6 +33,10 @@
 /** Provides utils for regional preferences. */
 public class RegionalPreferencesDataUtils {
     static final String DEFAULT_VALUE = "default";
+    static final String EXTENSION_TYPE_MEASUREMENT_SYSTEM = "ms";
+    static final String MEASUREMENT_SYSTEM_METRIC = "metric";
+    static final String MEASUREMENT_SYSTEM_UK = "uksystem";
+    static final String MEASUREMENT_SYSTEM_US = "ussystem";
 
     static String getDefaultUnicodeExtensionData(Context contxt, String type) {
         // 1. Check cache data in Settings provider.
@@ -118,4 +123,30 @@
                 return context.getString(R.string.default_string_of_regional_preference);
         }
     }
+
+    static String measurementSystemConverter(Context context, String unit) {
+        switch (unit) {
+            case MEASUREMENT_SYSTEM_METRIC:
+                return context.getString(R.string.metric_measurement_system);
+            case MEASUREMENT_SYSTEM_UK:
+                return context.getString(R.string.uk_measurement_system);
+            case MEASUREMENT_SYSTEM_US:
+                return context.getString(R.string.us_measurement_system);
+            default:
+                return context.getString(R.string.default_string_of_regional_preference);
+        }
+    }
+
+    static String getDefaultMeasurementSystem() {
+        LocaleList localeList = LocaleList.getDefault();
+        Locale locale = localeList.get(0);
+        ULocale uLocale = ULocale.forLocale(locale);
+        if (LocaleData.getMeasurementSystem(uLocale) == LocaleData.MeasurementSystem.SI) {
+            return RegionalPreferencesDataUtils.MEASUREMENT_SYSTEM_METRIC;
+        }
+        if (LocaleData.getMeasurementSystem(uLocale) == LocaleData.MeasurementSystem.UK) {
+            return RegionalPreferencesDataUtils.MEASUREMENT_SYSTEM_UK;
+        }
+        return RegionalPreferencesDataUtils.MEASUREMENT_SYSTEM_US;
+    }
 }
diff --git a/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java b/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java
index 8f9741a..4ffe279 100644
--- a/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java
@@ -57,7 +57,8 @@
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (KEY_ADD_DEVICE.equals(preference.getKey())) {
-            WifiDppUtils.showLockScreen(mContext, () -> launchWifiDppConfiguratorQrCodeScanner());
+            WifiDppUtils.showLockScreenForWifiSharing(mContext,
+                    () -> launchWifiDppConfiguratorQrCodeScanner());
             return true; /* click is handled */
         }
 
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index a8d7f41..ecddecf 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -980,7 +980,8 @@
      * Share the wifi network with QR code.
      */
     private void shareNetwork() {
-        WifiDppUtils.showLockScreen(mContext, () -> launchWifiDppConfiguratorActivity());
+        WifiDppUtils.showLockScreenForWifiSharing(mContext,
+                () -> launchWifiDppConfiguratorActivity());
     }
 
     /**
diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
index 23a6a54..24ab496 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.wifi.dpp;
 
+import android.annotation.NonNull;
+import android.annotation.SuppressLint;
 import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.Intent;
@@ -33,6 +35,9 @@
 import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.KeyProperties;
 import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
 
 import com.android.settings.R;
 import com.android.settings.Utils;
@@ -58,6 +63,8 @@
  * @see WifiQrCode
  */
 public class WifiDppUtils {
+    private static final String TAG = "WifiDppUtils";
+
     /**
      * The fragment tag specified to FragmentManager for container activities to manage fragments.
      */
@@ -109,7 +116,15 @@
 
     private static final Duration VIBRATE_DURATION_QR_CODE_RECOGNITION = Duration.ofMillis(3);
 
-    private static final String AES_CBC_PKCS7_PADDING = "AES/CBC/PKCS7Padding";
+    /**
+     * Parameters to check whether the device has been locked recently
+     */
+    @VisibleForTesting
+    public static final String AES_CBC_PKCS7_PADDING = "AES/CBC/PKCS7Padding";
+    @VisibleForTesting
+    public static final String WIFI_SHARING_KEY_ALIAS = "wifi_sharing_auth_key";
+    @VisibleForTesting
+    public static final int WIFI_SHARING_MAX_UNLOCK_SECONDS = 60;
 
     /**
      * Returns whether the device support WiFi DPP.
@@ -426,51 +441,75 @@
      * Shows authentication screen to confirm credentials (pin, pattern or password) for the current
      * user of the device.
      *
-     * @param context The {@code Context} used to get {@code KeyguardManager} service
+     * @param context         The {@code Context} used to get {@code KeyguardManager} service
      * @param successRunnable The {@code Runnable} which will be executed if the user does not setup
      *                        device security or if lock screen is unlocked
      */
-    public static void showLockScreen(Context context, Runnable successRunnable) {
-        final KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(
-                Context.KEYGUARD_SERVICE);
-
-        if (keyguardManager.isKeyguardSecure()) {
-            final BiometricPrompt.AuthenticationCallback authenticationCallback =
-                    new BiometricPrompt.AuthenticationCallback() {
-                        @Override
-                        public void onAuthenticationSucceeded(
-                                    BiometricPrompt.AuthenticationResult result) {
-                            successRunnable.run();
-                        }
-
-                        @Override
-                        public void onAuthenticationError(int errorCode, CharSequence errString) {
-                            //Do nothing
-                        }
-            };
-
-            final int userId = UserHandle.myUserId();
-
-            final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(context)
-                    .setTitle(context.getText(R.string.wifi_dpp_lockscreen_title));
-
-            if (keyguardManager.isDeviceSecure()) {
-                builder.setDeviceCredentialAllowed(true);
-                builder.setTextForDeviceCredential(
-                        null /* title */,
-                        Utils.getConfirmCredentialStringForUser(
-                                context, userId, Utils.getCredentialType(context, userId)),
-                        null /* description */);
-            }
-
-            final BiometricPrompt bp = builder.build();
-            final Handler handler = new Handler(Looper.getMainLooper());
-            bp.authenticate(new CancellationSignal(),
-                    runnable -> handler.post(runnable),
-                    authenticationCallback);
-        } else {
+    public static void showLockScreen(@NonNull Context context, @NonNull Runnable successRunnable) {
+        KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class);
+        if (keyguardManager == null || !keyguardManager.isKeyguardSecure()) {
             successRunnable.run();
+            return;
         }
+        showLockScreen(context, successRunnable, keyguardManager);
+    }
+
+    /**
+     * Shows authentication screen to confirm credentials (pin, pattern or password) for the
+     * current user of the device. But if the device has been unlocked recently, the
+     * authentication screen will be skipped.
+     *
+     * @param context         The {@code Context} used to get {@code KeyguardManager} service
+     * @param successRunnable The {@code Runnable} which will be executed if the user does not setup
+     *                        device security or if lock screen is unlocked
+     */
+    public static void showLockScreenForWifiSharing(@NonNull Context context,
+            @NonNull Runnable successRunnable) {
+        KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class);
+        if (keyguardManager == null || !keyguardManager.isKeyguardSecure()) {
+            successRunnable.run();
+            return;
+        }
+        if (isUnlockedWithinSeconds(WIFI_SHARING_KEY_ALIAS, WIFI_SHARING_MAX_UNLOCK_SECONDS)) {
+            Log.d(TAG, "Bypassing the lock screen because the device was unlocked recently.");
+            successRunnable.run();
+            return;
+        }
+        showLockScreen(context, successRunnable, keyguardManager);
+    }
+
+    @SuppressLint("MissingPermission")
+    private static void showLockScreen(@NonNull Context context, @NonNull Runnable successRunnable,
+            @NonNull KeyguardManager keyguardManager) {
+        BiometricPrompt.AuthenticationCallback authenticationCallback =
+                new BiometricPrompt.AuthenticationCallback() {
+                    @Override
+                    public void onAuthenticationSucceeded(
+                            BiometricPrompt.AuthenticationResult result) {
+                        successRunnable.run();
+                    }
+
+                    @Override
+                    public void onAuthenticationError(int errorCode, CharSequence errString) {
+                        //Do nothing
+                    }
+                };
+        int userId = UserHandle.myUserId();
+        BiometricPrompt.Builder builder = new BiometricPrompt.Builder(context)
+                .setTitle(context.getText(R.string.wifi_dpp_lockscreen_title));
+        if (keyguardManager.isDeviceSecure()) {
+            builder.setDeviceCredentialAllowed(true);
+            builder.setTextForDeviceCredential(
+                    null /* title */,
+                    Utils.getConfirmCredentialStringForUser(
+                            context, userId, Utils.getCredentialType(context, userId)),
+                    null /* description */);
+        }
+        BiometricPrompt bp = builder.build();
+        Handler handler = new Handler(Looper.getMainLooper());
+        bp.authenticate(new CancellationSignal(),
+                runnable -> handler.post(runnable),
+                authenticationCallback);
     }
 
     /**
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java
index 1bcff1e..d2d26ab 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java
@@ -123,7 +123,7 @@
     }
 
     private void shareHotspotNetwork(Intent intent) {
-        WifiDppUtils.showLockScreen(mContext, () -> {
+        WifiDppUtils.showLockScreenForWifiSharing(mContext, () -> {
             mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
                     SettingsEnums.ACTION_SETTINGS_SHARE_WIFI_HOTSPOT_QR_CODE,
                     SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR,
diff --git a/tests/robotests/src/com/android/settings/accessibility/HighContrastTextMigrationReceiverTest.java b/tests/robotests/src/com/android/settings/accessibility/HighContrastTextMigrationReceiverTest.java
new file mode 100644
index 0000000..0fedddc
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/HighContrastTextMigrationReceiverTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2024 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.settings.accessibility;
+
+import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.ACTION_RESTORED;
+import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.NOTIFICATION_CHANNEL;
+import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.NOTIFICATION_ID;
+import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.PromptState.PROMPT_SHOWN;
+import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.PromptState.PROMPT_UNNECESSARY;
+import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.PromptState.UNKNOWN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.graphics.hwui.flags.Flags;
+import com.android.settings.R;
+import com.android.settings.Utils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowNotification;
+import org.robolectric.shadows.ShadowNotificationManager;
+import org.robolectric.shadows.ShadowPackageManager;
+
+/** Tests for {@link HighContrastTextMigrationReceiver}. */
+@RunWith(RobolectricTestRunner.class)
+public class HighContrastTextMigrationReceiverTest {
+
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private HighContrastTextMigrationReceiver mReceiver;
+    private ShadowNotificationManager mShadowNotificationManager;
+
+    @Before
+    public void setUp() {
+        NotificationManager notificationManager =
+                mContext.getSystemService(NotificationManager.class);
+        mShadowNotificationManager = Shadows.shadowOf(notificationManager);
+
+        // Setup Settings app as a system app
+        ShadowPackageManager shadowPm = Shadows.shadowOf(mContext.getPackageManager());
+        ComponentName textReadingComponent = new ComponentName(Utils.SETTINGS_PACKAGE_NAME,
+                com.android.settings.Settings.TextReadingSettingsActivity.class.getName());
+        ActivityInfo activityInfo = shadowPm.addActivityIfNotPresent(textReadingComponent);
+        activityInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        shadowPm.addOrUpdateActivity(activityInfo);
+
+        mReceiver = new HighContrastTextMigrationReceiver();
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onReceive_flagOff_settingsNotSet() {
+        mReceiver.onReceive(mContext, new Intent(ACTION_RESTORED));
+
+        assertPromptStateAndHctState(/* promptState= */ UNKNOWN, /* hctState= */ OFF);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onRestored_hctStateOn_showPromptHctKeepsOn() {
+        setPromptStateAndHctState(/* promptState= */ UNKNOWN, /* hctState= */ ON);
+
+        mReceiver.onReceive(mContext, new Intent(ACTION_RESTORED));
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, ON);
+        verifyNotificationSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onRestored_hctStateOff_showPromptHctKeepsOff() {
+        setPromptStateAndHctState(/* promptState= */ UNKNOWN, /* hctState= */ OFF);
+
+        mReceiver.onReceive(mContext, new Intent(ACTION_RESTORED));
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, OFF);
+        verifyNotificationSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onPreBootCompleted_promptStateUnknownHctOn_showPromptAndAutoDisableHct() {
+        setPromptStateAndHctState(/* promptState= */ UNKNOWN, /* hctState= */ ON);
+
+        Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
+        mReceiver.onReceive(mContext, intent);
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, /* hctState= */ OFF);
+        verifyNotificationSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onPreBootCompleted_promptStateUnknownAndHctOff_promptIsUnnecessaryHctKeepsOff() {
+        setPromptStateAndHctState(/* promptState= */ UNKNOWN, /* hctState= */ OFF);
+
+        Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
+        mReceiver.onReceive(mContext, intent);
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_UNNECESSARY, /* hctState= */ OFF);
+        verifyNotificationNotSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onPreBootCompleted_promptStateShownAndHctOn_promptStateUnchangedHctKeepsOn() {
+        setPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, /* hctState= */ ON);
+
+        Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
+        mReceiver.onReceive(mContext, intent);
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, /* hctState= */ ON);
+        verifyNotificationNotSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onPreBootCompleted_promptStateShownAndHctOff_promptStateUnchangedHctKeepsOff() {
+        setPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, /* hctState= */ OFF);
+
+        Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
+        mReceiver.onReceive(mContext, intent);
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_SHOWN, /* hctState= */ OFF);
+        verifyNotificationNotSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onPreBootCompleted_promptStateUnnecessaryAndHctOn_promptStateUnchangedHctKeepsOn() {
+        setPromptStateAndHctState(/* promptState= */ PROMPT_UNNECESSARY, /* hctState= */ ON);
+
+        Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
+        mReceiver.onReceive(mContext, intent);
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_UNNECESSARY, /* hctState= */ ON);
+        verifyNotificationNotSent();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
+    public void onPreBootCompleted_promptStateUnnecessaryHctOff_promptStateUnchangedHctKeepsOff() {
+        setPromptStateAndHctState(/* promptState= */ PROMPT_UNNECESSARY, /* hctState= */ OFF);
+
+        Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
+        mReceiver.onReceive(mContext, intent);
+
+        assertPromptStateAndHctState(/* promptState= */ PROMPT_UNNECESSARY, /* hctState= */ OFF);
+        verifyNotificationNotSent();
+    }
+
+    private void verifyNotificationNotSent() {
+        Notification notification = mShadowNotificationManager.getNotification(NOTIFICATION_ID);
+        assertThat(notification).isNull();
+    }
+
+    private void verifyNotificationSent() {
+        // Verify hct channel created
+        assertThat(mShadowNotificationManager.getNotificationChannels().stream().anyMatch(
+                channel -> channel.getId().equals(NOTIFICATION_CHANNEL))).isTrue();
+
+        // Verify hct notification is sent with correct content
+        Notification notification = mShadowNotificationManager.getNotification(NOTIFICATION_ID);
+        assertThat(notification).isNotNull();
+
+        ShadowNotification shadowNotification = Shadows.shadowOf(notification);
+        assertThat(shadowNotification.getContentTitle()).isEqualTo(mContext.getString(
+                R.string.accessibility_toggle_high_text_contrast_preference_title));
+        assertThat(shadowNotification.getContentText()).isEqualTo(
+                mContext.getString(R.string.accessibility_notification_high_contrast_text_content));
+
+        assertThat(notification.actions.length).isEqualTo(1);
+        assertThat(notification.actions[0].title.toString()).isEqualTo(
+                mContext.getString(R.string.accessibility_notification_high_contrast_text_action));
+
+        PendingIntent pendingIntent = notification.actions[0].actionIntent;
+        Intent settingsIntent = Shadows.shadowOf(pendingIntent).getSavedIntent();
+        Bundle fragmentArgs = settingsIntent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+        assertThat(fragmentArgs).isNotNull();
+        assertThat(fragmentArgs.getString(EXTRA_FRAGMENT_ARG_KEY))
+                .isEqualTo(TextReadingPreferenceFragment.HIGH_TEXT_CONTRAST_KEY);
+    }
+
+    private void assertPromptStateAndHctState(
+            @HighContrastTextMigrationReceiver.PromptState int promptState,
+            @AccessibilityUtil.State int hctState) {
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS, UNKNOWN))
+                .isEqualTo(promptState);
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, OFF))
+                .isEqualTo(hctState);
+    }
+
+    private void setPromptStateAndHctState(
+            @HighContrastTextMigrationReceiver.PromptState int promptState,
+            @AccessibilityUtil.State int hctState) {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_HCT_RECT_PROMPT_STATUS, promptState);
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, hctState);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
index 05273fc..ba9eaa5 100644
--- a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
@@ -29,7 +29,6 @@
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Intent;
-import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.widget.PopupWindow;
 import android.widget.SeekBar;
@@ -44,7 +43,6 @@
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.testutils.shadow.ShadowFragment;
-import com.android.settings.widget.LabeledSeekBarPreference;
 import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -77,7 +75,7 @@
     private Activity mContext;
     private PreviewSizeSeekBarController mSeekBarController;
     private FontSizeData mFontSizeData;
-    private LabeledSeekBarPreference mSeekBarPreference;
+    private AccessibilitySeekBarPreference mSeekBarPreference;
 
     private PreferenceScreen mPreferenceScreen;
     private TestFragment mFragment;
@@ -109,7 +107,7 @@
         mPreferenceScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
         when(mPreferenceScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
         doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
-        mSeekBarPreference = spy(new LabeledSeekBarPreference(mContext, /* attrs= */ null));
+        mSeekBarPreference = spy(new AccessibilitySeekBarPreference(mContext, /* attrs= */ null));
         mSeekBarPreference.setKey(FONT_SIZE_KEY);
 
         LayoutInflater inflater = LayoutInflater.from(mContext);
@@ -246,12 +244,11 @@
 
     @Test
     @Config(shadows = ShadowFragment.class)
-    public void restoreValueFromSavedInstanceState_showTooltipView() {
-        final Bundle savedInstanceState = new Bundle();
-        savedInstanceState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true);
-        mSeekBarController.onCreate(savedInstanceState);
+    public void enabledNeedsQSTooltipReshow_showTooltipView() {
+        mSeekBarPreference.setNeedsQSTooltipReshow(true);
 
         mSeekBarController.displayPreference(mPreferenceScreen);
+        mSeekBarController.onStart();
         ShadowLooper.idleMainLooper();
 
         assertThat(getLatestPopupWindow().isShowing()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
index f768e42..375952f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
@@ -28,7 +28,6 @@
 
 import com.android.settings.display.PreviewPagerAdapter;
 import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
-import com.android.settings.widget.LabeledSeekBarPreference;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,8 +53,8 @@
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private TextReadingPreviewController mPreviewController;
     private TextReadingPreviewPreference mPreviewPreference;
-    private LabeledSeekBarPreference mFontSizePreference;
-    private LabeledSeekBarPreference mDisplaySizePreference;
+    private AccessibilitySeekBarPreference mFontSizePreference;
+    private AccessibilitySeekBarPreference mDisplaySizePreference;
 
     @Mock
     private DisplaySizeData mDisplaySizeData;
@@ -73,8 +72,8 @@
         mPreviewPreference = spy(new TextReadingPreviewPreference(mContext, /* attr= */ null));
         mPreviewController = new TextReadingPreviewController(mContext, PREVIEW_KEY, fontSizeData,
                 mDisplaySizeData);
-        mFontSizePreference = new LabeledSeekBarPreference(mContext, /* attr= */ null);
-        mDisplaySizePreference = new LabeledSeekBarPreference(mContext, /* attr= */ null);
+        mFontSizePreference = new AccessibilitySeekBarPreference(mContext, /* attr= */ null);
+        mDisplaySizePreference = new AccessibilitySeekBarPreference(mContext, /* attr= */ null);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java
index 9609af4..2251c3b 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java
@@ -124,24 +124,17 @@
         when(mCachedBluetoothDevice.getDrawableWithDescription()).thenReturn(pairs);
         when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(ImmutableSet.of());
 
-        mBluetoothDeviceUpdater =
-                spy(
-                        new AvailableMediaBluetoothDeviceUpdater(
-                                mContext, mDevicePreferenceCallback, /* metricsCategory= */ 0));
-        mBluetoothDeviceUpdater.setPrefContext(mContext);
         mPreference =
                 new BluetoothDevicePreference(
                         mContext,
                         mCachedBluetoothDevice,
                         false,
                         BluetoothDevicePreference.SortType.TYPE_DEFAULT);
-        doNothing().when(mBluetoothDeviceUpdater).addPreference(any());
-        doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
     }
 
     @Test
     public void onAudioModeChanged_hfpDeviceConnected_inCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -153,7 +146,7 @@
 
     @Test
     public void onAudioModeChanged_hfpDeviceConnected_notInCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -165,7 +158,7 @@
 
     @Test
     public void onAudioModeChanged_a2dpDeviceConnected_inCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -177,7 +170,7 @@
 
     @Test
     public void onAudioModeChanged_a2dpDeviceConnected_notInCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -189,7 +182,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_a2dpDeviceConnected_notInCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -202,7 +195,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_a2dpDeviceConnected_inCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -215,7 +208,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_hfpDeviceConnected_notInCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -228,7 +221,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_hfpDeviceConnected_inCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -241,7 +234,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_ashaHearingAidConnected_notInCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true);
@@ -256,7 +249,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_ashaHearingAidConnected_inCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true);
@@ -272,7 +265,7 @@
     @Test
     public void onProfileConnectionStateChanged_leaConnected_notInCallSharingFlagOff_addPref() {
         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -292,7 +285,7 @@
     @Test
     public void onProfileConnectionStateChanged_leaConnected_notInCallNotInSharing_addPref() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -309,7 +302,7 @@
     @Test
     public void onProfileConnectionStateChanged_leaConnected_inCallSharingFlagOff_addPref() {
         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -326,7 +319,7 @@
     @Test
     public void onProfileConnectionStateChanged_leaConnected_inCallNotInSharing_addPref() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -344,7 +337,7 @@
     public void onProfileConnectionStateChanged_leaConnected_notInCallInSharing_removePref() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
         mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -367,7 +360,7 @@
             onProfileConnectionStateChanged_leaConnected_noInCallInSharing_hysteresis_removePref() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
         mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -388,7 +381,7 @@
     public void onProfileConnectionStateChanged_leaConnected_inCallSharing_removePref() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
         mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -410,7 +403,7 @@
     public void onProfileConnectionStateChanged_leaConnected_inCallSharing_hysteresis_removePref() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
         mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -430,7 +423,7 @@
     @Test
     public void
             onProfileConnectionStateChanged_deviceIsNotInList_notInCall_invokesRemovePreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -446,7 +439,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_deviceIsNotInList_inCall_invokesRemovePreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.isDeviceConnected(any(CachedBluetoothDevice.class)))
                 .thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -462,6 +455,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_deviceDisconnected_removePreference() {
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         mBluetoothDeviceUpdater.onProfileConnectionStateChanged(
                 mCachedBluetoothDevice, BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.A2DP);
 
@@ -470,8 +464,19 @@
 
     @Test
     public void onClick_Preference_setActive() {
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         mBluetoothDeviceUpdater.onPreferenceClick(mPreference);
 
         verify(mDevicePreferenceCallback).onDeviceClick(mPreference);
     }
+
+    private void setUpDeviceUpdaterWithAudioMode(int audioMode) {
+        mAudioManager.setMode(audioMode);
+        mBluetoothDeviceUpdater =
+                spy(new AvailableMediaBluetoothDeviceUpdater(
+                                mContext, mDevicePreferenceCallback, /* metricsCategory= */ 0));
+        mBluetoothDeviceUpdater.setPrefContext(mContext);
+        doNothing().when(mBluetoothDeviceUpdater).addPreference(any());
+        doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
index b2449da..f68a8d4 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
@@ -112,16 +112,11 @@
         when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS);
         when(mCachedBluetoothDevice.getDrawableWithDescription()).thenReturn(pairs);
         mShadowCachedBluetoothDeviceManager.setCachedDevicesCopy(mCachedDevices);
-        mBluetoothDeviceUpdater = spy(new ConnectedBluetoothDeviceUpdater(mContext,
-                mDevicePreferenceCallback, /* metricsCategory= */ 0));
-        mBluetoothDeviceUpdater.setPrefContext(mContext);
-        doNothing().when(mBluetoothDeviceUpdater).addPreference(any());
-        doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
     }
 
     @Test
     public void onAudioModeChanged_hfpDeviceConnected_notInCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -133,7 +128,7 @@
 
     @Test
     public void onAudioModeChanged_hfpDeviceConnected_inCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -145,7 +140,7 @@
 
     @Test
     public void onAudioModeChanged_a2dpDeviceConnected_notInCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -157,7 +152,7 @@
 
     @Test
     public void onAudioModeChanged_a2dpDeviceConnected_inCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -169,7 +164,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_a2dpDeviceConnected_inCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -182,7 +177,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_deviceIsNotInList_inCall_invokesRemovePreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -196,7 +191,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_a2dpDeviceConnected_notInCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedA2dpDevice()).thenReturn(true);
@@ -209,7 +204,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_hfpDeviceConnected_inCall_removePreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -222,7 +217,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_hfpDeviceConnected_notInCall_addPreference() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -236,7 +231,7 @@
     @Test
     public void onProfileConnectionStateChanged_ashaHearingAidConnected_inCall_removePreference()
     {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true);
@@ -250,7 +245,7 @@
     @Test
     public void onProfileConnectionStateChanged_ashaHearingAidConnected_notInCall_removePreference()
     {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater.
                 isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true);
@@ -263,7 +258,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_leAudioDeviceConnected_inCall_removesPreference() {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater
                 .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -277,7 +272,7 @@
     @Test
     public void onProfileConnectionStateChanged_leAudioDeviceConnected_notInCall_removesPreference()
     {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater
                 .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -290,7 +285,7 @@
     @Test
     public void onProfileConnectionStateChanged_deviceIsNotInList_inCall_invokesRemovesPreference()
     {
-        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_IN_CALL);
         when(mBluetoothDeviceUpdater
                 .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -305,7 +300,7 @@
     @Test
     public void onProfileConnectionStateChanged_deviceIsNotInList_notInCall_invokesRemovesPreference
             () {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater
                 .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
@@ -319,6 +314,7 @@
 
     @Test
     public void onProfileConnectionStateChanged_deviceDisconnected_removePreference() {
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice,
                 BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.A2DP);
 
@@ -327,6 +323,7 @@
 
     @Test
     public void addPreference_addPreference_shouldHideSecondTarget() {
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         BluetoothDevicePreference btPreference =
                 new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
                         true, BluetoothDevicePreference.SortType.TYPE_DEFAULT);
@@ -340,7 +337,7 @@
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
     public void update_notExclusiveManagedDevice_addDevice() {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater
                 .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -356,7 +353,7 @@
     @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
     public void update_exclusivelyManagedDevice_packageNotInstalled_addDevice()
             throws Exception {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater
                 .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -376,7 +373,7 @@
             throws Exception {
         ApplicationInfo appInfo = new ApplicationInfo();
         appInfo.enabled = false;
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater
             .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -393,7 +390,7 @@
     @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
     public void update_exclusivelyManagedDevice_packageInstalledAndEnabled_removePreference()
             throws Exception {
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
+        setUpDeviceUpdaterWithAudioMode(AudioManager.MODE_NORMAL);
         when(mBluetoothDeviceUpdater
             .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
         when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
@@ -407,4 +404,13 @@
         verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice);
         verify(mBluetoothDeviceUpdater, never()).addPreference(mCachedBluetoothDevice);
     }
+
+    private void setUpDeviceUpdaterWithAudioMode(int audioMode) {
+        mAudioManager.setMode(audioMode);
+        mBluetoothDeviceUpdater = spy(new ConnectedBluetoothDeviceUpdater(mContext,
+                mDevicePreferenceCallback, /* metricsCategory= */ 0));
+        mBluetoothDeviceUpdater.setPrefContext(mContext);
+        doNothing().when(mBluetoothDeviceUpdater).addPreference(any());
+        doNothing().when(mBluetoothDeviceUpdater).removePreference(any());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallbackTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallbackTest.java
index 4e962c7..6aff8c3 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallbackTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryCallbackTest.java
@@ -54,7 +54,7 @@
 @RunWith(RobolectricTestRunner.class)
 @Config(
         shadows = {
-                ShadowBluetoothAdapter.class,
+            ShadowBluetoothAdapter.class,
         })
 public class AudioStreamsProgressCategoryCallbackTest {
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -70,8 +70,8 @@
     @Before
     public void setUp() {
         mSetFlagsRule.disableFlags(FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
-        ShadowBluetoothAdapter shadowBluetoothAdapter = Shadow.extract(
-                BluetoothAdapter.getDefaultAdapter());
+        ShadowBluetoothAdapter shadowBluetoothAdapter =
+                Shadow.extract(BluetoothAdapter.getDefaultAdapter());
         shadowBluetoothAdapter.setEnabled(true);
         shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
                 BluetoothStatusCodes.FEATURE_SUPPORTED);
@@ -87,7 +87,7 @@
         when(mState.getBisSyncState()).thenReturn(bisSyncState);
         mCallback.onReceiveStateChanged(mDevice, /* sourceId= */ 0, mState);
 
-        verify(mController).handleSourceConnected(any());
+        verify(mController).handleSourceConnected(any(), any());
     }
 
     @Test
@@ -102,7 +102,7 @@
         when(mSourceDevice.getAddress()).thenReturn(address);
         mCallback.onReceiveStateChanged(mDevice, /* sourceId= */ 0, mState);
 
-        verify(mController).handleSourcePresent(any());
+        verify(mController).handleSourcePresent(any(), any());
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryControllerTest.java
index 78d4d6e..f042329 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsProgressCategoryControllerTest.java
@@ -32,6 +32,7 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -41,7 +42,7 @@
 import static org.mockito.Mockito.when;
 import static org.robolectric.Shadows.shadowOf;
 
-import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
 
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
@@ -93,6 +94,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @RunWith(RobolectricTestRunner.class)
 @Config(
@@ -134,8 +136,8 @@
 
     @Before
     public void setUp() {
-        ShadowBluetoothAdapter shadowBluetoothAdapter = Shadow.extract(
-                BluetoothAdapter.getDefaultAdapter());
+        ShadowBluetoothAdapter shadowBluetoothAdapter =
+                Shadow.extract(BluetoothAdapter.getDefaultAdapter());
         shadowBluetoothAdapter.setEnabled(true);
         shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
                 BluetoothStatusCodes.FEATURE_SUPPORTED);
@@ -143,7 +145,7 @@
                 BluetoothStatusCodes.FEATURE_SUPPORTED);
         ShadowAudioStreamsHelper.setUseMock(mAudioStreamsHelper);
         when(mAudioStreamsHelper.getLeBroadcastAssistant()).thenReturn(mLeBroadcastAssistant);
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(emptyList());
+        when(mAudioStreamsHelper.getAllSourcesByDevice()).thenReturn(emptyMap());
         mSetFlagsRule.disableFlags(FLAG_AUDIO_SHARING_HYSTERESIS_MODE_FIX);
 
         ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
@@ -310,14 +312,12 @@
         // Setup a device
         ShadowAudioStreamsHelper.setCachedBluetoothDeviceInSharingOrLeConnected(mDevice);
 
-        List<BluetoothLeBroadcastReceiveState> connectedList = new ArrayList<>();
         // Empty connected device list
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(connectedList);
+        when(mAudioStreamsHelper.getAllSourcesByDevice()).thenReturn(emptyMap());
 
         mController.onStart(mLifecycleOwner);
         shadowOf(Looper.getMainLooper()).idle();
 
-        verify(mAudioStreamsHelper).getAllPresentSources();
         verify(mLeBroadcastAssistant).startSearchingForSources(any());
 
         var dialog = ShadowAlertDialog.getLatestAlertDialog();
@@ -355,7 +355,7 @@
     }
 
     @Test
-    public void testOnStart_handleSourceAlreadyConnected() {
+    public void testOnStart_handleSourceAlreadyConnected_useNameFromMetadata() {
         // Setup a device
         ShadowAudioStreamsHelper.setCachedBluetoothDeviceInSharingOrLeConnected(mDevice);
 
@@ -363,8 +363,14 @@
         BluetoothLeBroadcastReceiveState connected =
                 createConnectedMock(ALREADY_CONNECTED_BROADCAST_ID);
         List<BluetoothLeBroadcastReceiveState> list = new ArrayList<>();
+        var data = mock(BluetoothLeAudioContentMetadata.class);
+        when(connected.getSubgroupMetadata()).thenReturn(ImmutableList.of(data));
+        when(data.getProgramInfo()).thenReturn(BROADCAST_NAME_1);
         list.add(connected);
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(list);
+        when(mMetadata.getBroadcastId()).thenReturn(ALREADY_CONNECTED_BROADCAST_ID);
+        when(mMetadata.getBroadcastName()).thenReturn(BROADCAST_NAME_2);
+        when(mLeBroadcastAssistant.getSourceMetadata(any(), anyInt())).thenReturn(mMetadata);
+        when(mAudioStreamsHelper.getAllSourcesByDevice()).thenReturn(Map.of(mSourceDevice, list));
 
         // Handle already connected source in onStart
         mController.displayPreference(mScreen);
@@ -382,6 +388,7 @@
         assertThat(preference.getValue()).isNotNull();
         assertThat(preference.getValue().getAudioStreamBroadcastId())
                 .isEqualTo(ALREADY_CONNECTED_BROADCAST_ID);
+        assertThat(preference.getValue().getTitle()).isEqualTo(BROADCAST_NAME_2);
         assertThat(state.getValue()).isEqualTo(SOURCE_ADDED);
     }
 
@@ -409,7 +416,8 @@
         var data = mock(BluetoothLeAudioContentMetadata.class);
         when(connected.getSubgroupMetadata()).thenReturn(ImmutableList.of(data));
         when(data.getProgramInfo()).thenReturn(BROADCAST_NAME_1);
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(ImmutableList.of(connected));
+        when(mAudioStreamsHelper.getAllSourcesByDevice())
+                .thenReturn(Map.of(mSourceDevice, ImmutableList.of(connected)));
 
         // Handle both source from qr code and already connected source in onStart
         mController.displayPreference(mScreen);
@@ -578,8 +586,8 @@
         // Setup source already connected
         BluetoothLeBroadcastReceiveState connected =
                 createConnectedMock(ALREADY_CONNECTED_BROADCAST_ID);
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(ImmutableList.of(connected));
-
+        when(mAudioStreamsHelper.getAllSourcesByDevice())
+                .thenReturn(Map.of(mSourceDevice, List.of(connected)));
         // Handle source already connected in onStart
         mController.displayPreference(mScreen);
         mController.onStart(mLifecycleOwner);
@@ -687,7 +695,8 @@
         // Setup already connected source
         BluetoothLeBroadcastReceiveState connected =
                 createConnectedMock(ALREADY_CONNECTED_BROADCAST_ID);
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(ImmutableList.of(connected));
+        when(mAudioStreamsHelper.getAllSourcesByDevice())
+                .thenReturn(Map.of(mSourceDevice, List.of(connected)));
 
         // Handle connected source in onStart
         mController.displayPreference(mScreen);
@@ -695,7 +704,7 @@
         shadowOf(Looper.getMainLooper()).idle();
 
         // The connect source is no longer connected
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(emptyList());
+        when(mAudioStreamsHelper.getAllSourcesByDevice()).thenReturn(emptyMap());
         mController.handleSourceRemoved();
         shadowOf(Looper.getMainLooper()).idle();
 
@@ -728,7 +737,8 @@
         // Setup a connected source
         BluetoothLeBroadcastReceiveState connected =
                 createConnectedMock(ALREADY_CONNECTED_BROADCAST_ID);
-        when(mAudioStreamsHelper.getAllConnectedSources()).thenReturn(ImmutableList.of(connected));
+        when(mAudioStreamsHelper.getAllSourcesByDevice())
+                .thenReturn(Map.of(mSourceDevice, List.of(connected)));
 
         // Handle connected source in onStart
         mController.displayPreference(mScreen);
@@ -834,7 +844,7 @@
         when(receiveState.getBisSyncState()).thenReturn(bisSyncState);
 
         // The new found source is identified as failed to connect
-        mController.handleSourcePresent(receiveState);
+        mController.handleSourcePresent(mSourceDevice, receiveState);
         shadowOf(Looper.getMainLooper()).idle();
 
         ArgumentCaptor<AudioStreamPreference> preference =
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/testshadows/ShadowAudioStreamsHelper.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/testshadows/ShadowAudioStreamsHelper.java
index c7d0c60..e5e51fc 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/testshadows/ShadowAudioStreamsHelper.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/testshadows/ShadowAudioStreamsHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.connecteddevice.audiosharing.audiostreams.testshadows;
 
+import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothLeBroadcastMetadata;
 import android.bluetooth.BluetoothLeBroadcastReceiveState;
 
@@ -31,6 +32,7 @@
 import org.robolectric.annotation.Resetter;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 @Implements(value = AudioStreamsHelper.class, callThroughByDefault = true)
@@ -60,6 +62,11 @@
     }
 
     @Implementation
+    public Map<BluetoothDevice, List<BluetoothLeBroadcastReceiveState>> getAllSourcesByDevice() {
+        return sMockHelper.getAllSourcesByDevice();
+    }
+
+    @Implementation
     public List<BluetoothLeBroadcastReceiveState> getAllPresentSources() {
         return sMockHelper.getAllPresentSources();
     }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt b/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt
index 0784362..76f9bfc 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt
+++ b/tests/robotests/src/com/android/settings/connecteddevice/display/TopologyScaleTest.kt
@@ -35,6 +35,7 @@
     fun oneDisplay4to3Aspect() {
         val scale = TopologyScale(
                 /* paneWidth= */ 640,
+                minEdgeLength = 48, maxBlockRatio = 0.05f,
                 listOf(RectF(0f, 0f, 640f, 480f)))
 
         // blockRatio is higher than 0.05 in order to make the smallest display edge (480 dp) 48dp
@@ -51,6 +52,7 @@
     fun twoUnalignedDisplays() {
         val scale = TopologyScale(
                 /* paneWidth= */ 300,
+                minEdgeLength = 48, maxBlockRatio = 0.05f,
                 listOf(RectF(0f, 0f, 1920f, 1200f), RectF(1920f, -300f, 3840f, 900f)))
 
         assertEquals(
@@ -65,6 +67,7 @@
     fun twoDisplaysBlockRatioBumpedForGarSizeMinimumHorizontal() {
         val scale = TopologyScale(
                 /* paneWidth= */ 192,
+                minEdgeLength = 48, maxBlockRatio = 0.05f,
                 listOf(RectF(0f, 0f, 240f, 320f), RectF(-240f, -320f, 0f, 0f)))
 
         // blockRatio is higher than 0.05 in order to make the smallest display edge (240 dp) 48dp
@@ -81,6 +84,7 @@
     fun paneVerticalPaddingLimitedByTallestDisplay() {
         val scale = TopologyScale(
                 /* paneWidth= */ 300,
+                minEdgeLength = 48, maxBlockRatio = 0.05f,
                 listOf(
                         RectF(0f, 0f, 640f, 480f),
                         RectF(0f, 480f, 640f, 960f),
@@ -94,4 +98,35 @@
         assertEquals(Point(150, 48), scale.displayToPaneCoor(PointF(320f, 0f)))
         assertPointF(-180f, 2880f, 0.001f, scale.paneToDisplayCoor(Point(100, 336)))
     }
+
+    @Test
+    fun limitedByCustomMaxBlockRatio() {
+        val scale = TopologyScale(
+                /* paneWidth= */ 300,
+                minEdgeLength = 24, maxBlockRatio = 0.12f,
+                listOf(
+                        RectF(0f, 0f, 640f, 480f),
+                        RectF(0f, 480f, 640f, 960f)))
+
+        assertEquals(
+                "{TopoScale blockRatio=0.120000 originPaneXY=111,57 paneHeight=230}", "" + scale)
+        assertEquals(Point(149, 57), scale.displayToPaneCoor(PointF(320f, 0f)))
+        assertPointF(-91.6667f, 2325f, 0.001f, scale.paneToDisplayCoor(Point(100, 336)))
+    }
+
+    @Test
+    fun largeCustomMinEdgeLength() {
+        // minBlockEdgeLength/minDisplayEdgeLength = 80/480 = 1/6, so the block ratio will be 1/6
+        val scale = TopologyScale(
+                /* paneWidth= */ 300,
+                minEdgeLength = 80, maxBlockRatio = 0.05f,
+                listOf(
+                        RectF(0f, 0f, 640f, 480f),
+                        RectF(0f, 480f, 640f, 960f)))
+
+        assertEquals(
+                "{TopoScale blockRatio=0.166667 originPaneXY=96,80 paneHeight=320}", "" + scale)
+        assertEquals(Point(149, 80), scale.displayToPaneCoor(PointF(320f, 0f)))
+        assertPointF(24f, 1536f, 0.001f, scale.paneToDisplayCoor(Point(100, 336)))
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsControllerTest.java
index 9d3cc5f..f3fe93d 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TouchpadAndMouseSettingsControllerTest.java
@@ -23,12 +23,15 @@
 import static org.junit.Assume.assumeTrue;
 
 import android.content.Context;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.view.InputDevice;
 
 import androidx.preference.Preference;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.keyboard.Flags;
 import com.android.settings.testutils.shadow.ShadowInputDevice;
 
 import org.junit.Before;
@@ -48,6 +51,8 @@
 })
 public class TouchpadAndMouseSettingsControllerTest {
     @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+    @Rule
     public MockitoRule rule = MockitoJUnit.rule();
 
     private static final String PREFERENCE_KEY = "trackpad_settings";
@@ -80,6 +85,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED)
     public void getAvailabilityStatus_isTouchpadAvailable() {
         int deviceId = 1;
         ShadowInputDevice.sDeviceIds = new int[]{deviceId};
@@ -92,6 +98,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED)
     public void getAvailabilityStatus_isMouseAvailable() {
         assumeTrue(enableVectorCursorA11ySettings());
 
diff --git a/tests/spa_unit/src/com/android/settings/spa/wifi/dpp/WifiDppUtilsTest.kt b/tests/spa_unit/src/com/android/settings/spa/wifi/dpp/WifiDppUtilsTest.kt
new file mode 100644
index 0000000..31ee9e6
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/wifi/dpp/WifiDppUtilsTest.kt
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2024 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.settings.spa.wifi.dpp
+
+import android.app.KeyguardManager
+import android.content.Context
+import android.hardware.biometrics.BiometricPrompt
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.dx.mockito.inline.extended.ExtendedMockito
+import com.android.settings.wifi.dpp.WifiDppUtils
+import java.security.InvalidKeyException
+import java.security.Key
+import javax.crypto.Cipher
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.any
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoSession
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.doThrow
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+import org.mockito.kotlin.whenever
+import org.mockito.quality.Strictness
+
+@RunWith(AndroidJUnit4::class)
+class WifiDppUtilsTest {
+    private lateinit var mockSession: MockitoSession
+
+    private val runnable = mock<Runnable>()
+    private val cipher = mock<Cipher>()
+    private var mockKeyguardManager = mock<KeyguardManager>()
+    private var context: Context =
+        spy(ApplicationProvider.getApplicationContext()) {
+            on { getSystemService(KeyguardManager::class.java) } doReturn mockKeyguardManager
+        }
+
+    @Before
+    fun setUp() {
+        mockSession =
+            ExtendedMockito.mockitoSession()
+                .initMocks(this)
+                .mockStatic(Cipher::class.java)
+                .mockStatic(BiometricPrompt::class.java)
+                .mockStatic(BiometricPrompt.Builder::class.java)
+                .strictness(Strictness.LENIENT)
+                .startMocking()
+        whenever(context.applicationContext).thenReturn(context)
+    }
+
+    @After
+    fun tearDown() {
+        mockSession.finishMocking()
+    }
+
+    @Test
+    fun showLockScreen_notKeyguardSecure_runRunnable() {
+        mockKeyguardManager.stub { on { isKeyguardSecure } doReturn false }
+
+        WifiDppUtils.showLockScreen(context, runnable)
+
+        verify(runnable).run()
+    }
+
+    @Test
+    fun showLockScreen_isKeyguardSecure_doNotRunRunnable() {
+        mockKeyguardManager.stub { on { isKeyguardSecure } doReturn true }
+
+        try {
+            WifiDppUtils.showLockScreen(context, runnable)
+        } catch (_: Exception) {}
+
+        verify(runnable, never()).run()
+    }
+
+    @Test
+    fun showLockScreenForWifiSharing_deviceUnlockedRecently_runRunnable() {
+        mockKeyguardManager.stub { on { isKeyguardSecure } doReturn true }
+        whenever(Cipher.getInstance(WifiDppUtils.AES_CBC_PKCS7_PADDING)).thenReturn(cipher)
+
+        WifiDppUtils.showLockScreenForWifiSharing(context, runnable)
+
+        verify(runnable).run()
+    }
+
+    @Test
+    fun showLockScreenForWifiSharing_deviceNotUnlockedRecently_doNotRunRunnable() {
+        mockKeyguardManager.stub { on { isKeyguardSecure } doReturn true }
+        whenever(Cipher.getInstance(WifiDppUtils.AES_CBC_PKCS7_PADDING)).thenReturn(cipher)
+        doThrow(InvalidKeyException()).whenever(cipher).init(anyInt(), any<Key>())
+
+        try {
+            WifiDppUtils.showLockScreenForWifiSharing(context, runnable)
+        } catch (_: Exception) {}
+
+        verify(runnable, never()).run()
+    }
+}