Merge "Fix cast of RestrictedSwitchPreference to SwitchPreference" into main
diff --git a/Android.bp b/Android.bp
index eef73a4..737c16c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -109,6 +109,7 @@
"statslog-settings",
"androidx.test.rules",
"telephony_flags_core_java_lib",
+ "setupdesign-lottie-loading-layout",
],
plugins: ["androidx.room_room-compiler-plugin"],
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 195c44e..e4ed275 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -802,6 +802,11 @@
</intent-filter>
</activity>
+ <activity android:name=".network.SimOnboardingActivity"
+ android:exported="false"
+ android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"
+ android:theme="@style/Theme.SpaLib.BottomSheetDialog"/>
+
<activity android:name=".network.telephony.ToggleSubscriptionDialogActivity"
android:exported="false"
android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"
@@ -3232,7 +3237,8 @@
<receiver
android:name=".fuelgauge.batteryusage.BootBroadcastReceiver"
- android:exported="true">
+ android:exported="true"
+ android:permission="com.android.settings.BATTERY_DATA">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="com.google.android.setupwizard.SETUP_WIZARD_FINISHED"/>
@@ -4403,9 +4409,12 @@
<activity android:name=".applications.credentials.CredentialsPickerActivity"
android:excludeFromRecents="true"
android:launchMode="singleInstance"
- android:exported="false">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.applications.credentials.DefaultCombinedPicker" />
+ android:exported="true">
+ <intent-filter android:priority="1">
+ <action android:name="android.settings.REQUEST_SET_AUTOFILL_SERVICE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="package" />
+ </intent-filter>
</activity>
<activity
@@ -4550,19 +4559,6 @@
android:exported="false">
</activity>
- <activity android:name=".applications.autofill.AutofillPickerTrampolineActivity"
- android:theme="@android:style/Theme.NoDisplay"
- android:excludeFromRecents="true"
- android:launchMode="singleInstance"
- android:exported="true"
- android:label="@string/autofill_app">
- <intent-filter android:priority="1">
- <action android:name="android.settings.REQUEST_SET_AUTOFILL_SERVICE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="package" />
- </intent-filter>
- </activity>
-
<activity android:name="Settings$AdvancedConnectedDeviceActivity"
android:exported="true"
android:label="@string/connected_device_connections_title">
@@ -5070,6 +5066,11 @@
<activity android:name=".privatespace.PrivateProfileContextHelperActivity" android:exported="false"/>
+ <activity android:name=".privatespace.delete.PrivateSpaceDeleteActivity"
+ android:label="@string/private_space_delete_header"
+ android:exported="false">
+ </activity>
+
<activity-alias android:name="UsageStatsActivity"
android:exported="true"
android:label="@string/testing_usage_stats"
diff --git a/OWNERS b/OWNERS
index 6698752..12cd4ea 100644
--- a/OWNERS
+++ b/OWNERS
@@ -11,7 +11,6 @@
jiannan@google.com
millchen@google.com
sunnyshao@google.com
-yantingyang@google.com
# Android Settings extended
chaohuiw@google.com
diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig
index 5ba2129..0fc164e 100644
--- a/aconfig/settings_connecteddevice_flag_declarations.aconfig
+++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig
@@ -33,4 +33,11 @@
namespace: "pixel_cross_device_control"
description: "Order the saved bluetooth devices by most recently connected."
bug: "306160434"
+}
+
+flag {
+ name: "enable_hide_exclusively_managed_bluetooth_device"
+ namespace: "dck_framework"
+ description: "Hide exclusively managed Bluetooth devices in BT settings menu."
+ bug: "322285078"
}
\ No newline at end of file
diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig
index 56c4b32..36f104c 100644
--- a/aconfig/settings_flag_declarations.aconfig
+++ b/aconfig/settings_flag_declarations.aconfig
@@ -13,3 +13,10 @@
description: "Enabling will provide an explicit package name for Intent to update mainline modules"
bug: "278987474"
}
+
+flag {
+ name: "app_archiving"
+ namespace: "android_settings"
+ description: "Feature flag to enable the archiving feature."
+ bug: "323164382"
+}
diff --git a/res/layout/dialog_audio_sharing_join.xml b/res/layout/dialog_audio_sharing_join.xml
index 4bdab7f..bfd4c77 100644
--- a/res/layout/dialog_audio_sharing_join.xml
+++ b/res/layout/dialog_audio_sharing_join.xml
@@ -24,16 +24,7 @@
android:paddingBottom="?android:dialogPreferredPadding">
<TextView
- android:id="@+id/share_audio_subtitle1"
- style="@style/DeviceAudioSharingText"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:paddingBottom="14dp"
- android:textFontWeight="500" />
-
- <TextView
- android:id="@+id/share_audio_subtitle2"
+ android:id="@+id/share_audio_subtitle"
style="@style/DeviceAudioSharingText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/res/layout/private_space_confirm_deletion.xml b/res/layout/private_space_confirm_deletion.xml
new file mode 100644
index 0000000..31418e1
--- /dev/null
+++ b/res/layout/private_space_confirm_deletion.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<com.google.android.setupdesign.GlifLoadingLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/private_space_delete_confirm"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:icon="@drawable/ic_delete_accent"
+ app:sudUsePartnerHeavyTheme="true"
+ app:sudIllustrationType="default"
+ app:sudDescriptionText = "@string/private_space_confirm_deletion_summary"
+ app:sucHeaderText="@string/private_space_confirm_deletion_header">
+</com.google.android.setupdesign.GlifLoadingLayout>
\ No newline at end of file
diff --git a/res/layout/private_space_delete.xml b/res/layout/private_space_delete.xml
new file mode 100644
index 0000000..9fc3615
--- /dev/null
+++ b/res/layout/private_space_delete.xml
@@ -0,0 +1,68 @@
+<?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.
+ -->
+
+<com.google.android.setupdesign.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/private_space_delete_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:icon="@drawable/ic_delete_accent"
+ app:sucHeaderText="@string/private_space_delete_header">
+
+ <ScrollView
+ android:id="@+id/private_space_delete_scrollview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:id="@+id/private_space_delete_container"
+ style="@style/SudContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
+ android:id="@+id/sud_layout_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/private_space_delete_summary"/>
+
+ <TextView
+ android:id="@+id/accounts_label"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
+ android:layout_marginTop="20dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:text="@string/private_space_accounts"/>
+ <LinearLayout
+ android:id="@+id/accounts"
+ android:layout_marginTop="20dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="gone">
+ <!-- Do not add any children here as they will be removed in the MainClear.java
+ code. A list of accounts will be inserted programmatically. -->
+ </LinearLayout>
+ </LinearLayout>
+ </ScrollView>
+</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/navigation/private_space_delete_nav.xml b/res/navigation/private_space_delete_nav.xml
new file mode 100644
index 0000000..b8850b7
--- /dev/null
+++ b/res/navigation/private_space_delete_nav.xml
@@ -0,0 +1,31 @@
+<!--
+ ~ 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.
+ -->
+
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/private_space_delete_nav"
+ app:startDestination="@id/ps_delete_fragment">
+ <fragment android:id="@+id/ps_delete_fragment"
+ android:name="com.android.settings.privatespace.delete.PrivateSpaceDeleteFragment"
+ android:label="fragment_ps_delete">
+ <action
+ android:id="@+id/action_authenticate_delete"
+ app:destination="@id/ps_delete_progress_fragment"/>
+ </fragment>
+ <fragment android:id="@+id/ps_delete_progress_fragment"
+ android:name="com.android.settings.privatespace.delete.PrivateSpaceDeletionProgressFragment"
+ android:label="fragment_ps_auto_advance"/>
+</navigation>
diff --git a/res/raw/fold_setting_grace_period_selective_stay_awake_lottie.json b/res/raw/fold_setting_grace_period_selective_stay_awake_lottie.json
new file mode 100644
index 0000000..db56ef4
--- /dev/null
+++ b/res/raw/fold_setting_grace_period_selective_stay_awake_lottie.json
@@ -0,0 +1 @@
+{"v":"5.12.1","fr":60,"ip":0,"op":391,"w":412,"h":300,"nm":"Foldable_FoldingSetting_EDU_02_412x300_export","ddd":0,"assets":[{"id":"comp_0","nm":"Lockscreen","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"lock","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.5,214,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],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.921,11.333],[-9.868,11.333],[-9.868,-2],[5.921,-2]],"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.515,-0.522],[0.724,0],[0.515,0.522],[0,0.733],[-0.515,0.522],[-0.724,0],[-0.515,-0.522],[0,-0.733]],"o":[[-0.515,0.522],[-0.724,0],[-0.515,-0.522],[0,-0.733],[0.515,-0.522],[0.724,0],[0.515,0.522],[0,0.733]],"v":[[-0.115,6.55],[-1.974,7.333],[-3.832,6.55],[-4.605,4.667],[-3.832,2.783],[-1.974,2],[-0.115,2.783],[0.658,4.667]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-0.515,-0.522],[-0.724,0],[0,0],[-0.515,0.522],[0,0.733],[0,0],[0.515,0.522],[0.724,0],[0,0],[0,0],[-0.768,0.778],[-1.096,0],[-0.768,-0.778],[0,-1.111],[0,0],[1.283,1.3],[1.82,0],[1.283,-1.3],[0,-1.844],[0,0],[0,0],[0.515,-0.522],[0,-0.733],[0,0]],"o":[[0.515,0.522],[0,0],[0.724,0],[0.515,-0.522],[0,0],[0,-0.733],[-0.515,-0.522],[0,0],[0,0],[0,-1.111],[0.768,-0.778],[1.096,0],[0.768,0.778],[0,0],[0,-1.844],[-1.283,-1.3],[-1.82,0],[-1.283,1.3],[0,0],[0,0],[-0.724,0],[-0.515,0.522],[0,0],[0,0.733]],"v":[[-11.727,13.217],[-9.868,14],[5.921,14],[7.78,13.217],[8.553,11.333],[8.553,-2],[7.78,-3.883],[5.921,-4.667],[1.974,-4.667],[1.974,-7.333],[3.125,-10.167],[5.921,-11.333],[8.717,-10.167],[9.868,-7.333],[12.5,-7.333],[10.576,-12.05],[5.921,-14],[1.266,-12.05],[-0.658,-7.333],[-0.658,-4.667],[-9.868,-4.667],[-11.727,-3.883],[-12.5,-2],[-12.5,11.333]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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,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":"Vector","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"clock","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.116,143.317,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.92,-2.182],[0,-2.945],[0,0],[-0.894,-2.182],[-1.578,-1.209],[-2.104,0],[-1.604,1.209],[-0.868,2.182],[0,2.919],[0.894,2.182],[1.604,1.21],[2.103,0],[1.604,-1.21]],"o":[[-0.894,2.182],[0,0],[0,2.971],[0.92,2.182],[1.604,1.183],[2.077,0],[1.604,-1.209],[0.894,-2.209],[0,-2.945],[-0.868,-2.182],[-1.578,-1.21],[-2.104,0],[-1.578,1.21]],"v":[[-20.775,-24.257],[-22.116,-16.565],[-22.116,-16.565],[-20.775,-8.835],[-17.028,-3.747],[-11.467,-1.972],[-5.945,-3.786],[-2.238,-8.874],[-0.897,-16.565],[-2.238,-24.257],[-5.945,-29.344],[-11.467,-31.159],[-17.028,-29.344]],"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.789,-2.051],[0,-2.735],[0,0],[0.789,-2.051],[1.446,-1.157],[1.972,0],[1.446,1.131],[0.815,2.051],[0,2.708],[-0.789,2.051],[-1.446,1.131],[-1.92,0],[-1.446,-1.157]],"o":[[0.815,2.051],[0,0],[0,2.735],[-0.789,2.051],[-1.446,1.131],[-1.946,0],[-1.446,-1.157],[-0.789,-2.077],[0,-2.735],[0.815,-2.051],[1.472,-1.157],[1.946,0],[1.446,1.131]],"v":[[-3.066,-23.744],[-1.843,-16.565],[-1.843,-16.565],[-3.027,-9.387],[-6.379,-4.575],[-11.507,-2.879],[-16.594,-4.575],[-19.986,-9.387],[-21.17,-16.565],[-19.986,-23.744],[-16.594,-28.516],[-11.507,-30.252],[-6.419,-28.516]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-1.394,-0.763],[-1.604,0],[0,0],[-0.868,0.316],[-0.657,0.473],[-0.394,0.526],[0,0],[0,0],[0,0],[-0.289,0.92],[0,1.157],[0.815,1.367],[1.42,0.815],[1.814,0],[1.42,-0.815],[0.815,-1.394],[0,-1.735],[-0.841,-1.367]],"o":[[1.394,0.763],[0,0],[1.078,0],[0.868,-0.316],[0.684,-0.5],[0,0],[0,0],[0,0],[0.526,-0.789],[0.316,-0.92],[0,-1.709],[-0.815,-1.394],[-1.42,-0.841],[-1.762,0],[-1.42,0.815],[-0.815,1.367],[0,1.735],[0.868,1.341]],"v":[[6.616,-14.317],[11.112,-13.173],[11.112,-13.173],[14.031,-13.647],[16.318,-14.83],[17.936,-16.368],[8.746,-2.524],[9.574,-2.012],[19.04,-16.447],[20.263,-19.011],[20.736,-22.127],[19.513,-26.741],[16.161,-30.054],[11.309,-31.317],[6.537,-30.094],[3.184,-26.781],[1.962,-22.127],[3.224,-17.473]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-0.736,-1.262],[0,-1.525],[0,0],[0.815,-1.236],[1.288,-0.657],[1.473,0],[1.315,0.71],[0.789,1.21],[0,1.551],[-0.736,1.262],[-1.262,0.736],[-1.604,0],[-1.288,-0.763]],"o":[[0.736,1.236],[0,0],[0,1.657],[-0.815,1.21],[-1.288,0.657],[-1.473,0],[-1.288,-0.71],[-0.763,-1.236],[0,-1.551],[0.736,-1.262],[1.288,-0.736],[1.63,0],[1.288,0.763]],"v":[[18.724,-26.268],[19.829,-22.127],[19.829,-22.127],[18.606,-17.788],[15.451,-14.988],[11.309,-14.002],[7.129,-15.067],[4.013,-17.946],[2.869,-22.127],[3.973,-26.347],[6.971,-29.344],[11.309,-30.449],[15.687,-29.305]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-0.789,1.288],[0,1.788],[0,0],[0.605,0.973],[1.131,0.578],[1.578,0.079],[-0.947,0.552],[-0.473,0.92],[0,1.209],[0.736,1.104],[1.262,0.578],[1.63,0],[1.525,-1.078],[0.605,-1.709],[0,0],[-1.367,0.973],[-1.972,0],[-1.104,-0.526],[-0.631,-0.999],[0,-1.394],[0.526,-0.894],[1.052,-0.526],[1.657,0],[0,0],[0,0],[0,0],[-1.21,-0.526],[-0.579,-0.973],[0,-1.262],[0.684,-1.157],[1.262,-0.631],[1.683,0],[1.236,0.552],[0.815,0.947],[0.368,1.209],[0,0],[-0.894,-1.025],[-1.367,-0.631],[-1.814,0],[-1.367,0.684]],"o":[[0.815,-1.288],[0,0],[0,-1.367],[-0.579,-0.999],[-1.104,-0.578],[1.446,-0.158],[0.947,-0.552],[0.473,-0.92],[0,-1.604],[-0.71,-1.131],[-1.262,-0.578],[-2.235,0],[-1.499,1.078],[0,0],[0.578,-1.578],[1.367,-0.973],[1.446,0],[1.104,0.526],[0.657,0.973],[0,1.183],[-0.5,0.894],[-1.052,0.526],[0,0],[0,0],[0,0],[1.841,0],[1.209,0.526],[0.605,0.947],[0,1.63],[-0.684,1.157],[-1.236,0.605],[-1.63,0],[-1.236,-0.552],[-0.789,-0.947],[0,0],[0.342,1.236],[0.894,1.025],[1.367,0.605],[1.814,0],[1.393,-0.71]],"v":[[-3.46,27.293],[-2.238,22.679],[-2.238,22.679],[-3.145,19.169],[-5.709,16.802],[-9.732,15.816],[-6.142,14.751],[-4.013,12.542],[-3.303,9.348],[-4.407,5.285],[-7.365,2.721],[-11.704,1.854],[-17.344,3.471],[-20.499,7.652],[-19.631,8.046],[-16.713,4.22],[-11.704,2.761],[-7.878,3.55],[-5.275,5.837],[-4.289,9.387],[-5.078,12.503],[-7.405,14.633],[-11.467,15.422],[-14.425,15.422],[-14.425,16.329],[-11.388,16.329],[-6.813,17.118],[-4.131,19.366],[-3.224,22.679],[-4.249,26.86],[-7.168,29.542],[-11.546,30.449],[-15.845,29.621],[-18.922,27.372],[-20.657,24.138],[-21.525,24.533],[-19.671,27.925],[-16.279,30.409],[-11.507,31.317],[-6.734,30.291]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0.92,-2.182],[0,-2.945],[-0.894,-2.182],[-1.578,-1.209],[-2.104,0],[-1.604,1.209],[-0.868,2.182],[0,2.919],[0.894,2.182],[1.604,1.209],[2.104,0],[1.604,-1.209]],"o":[[-0.894,2.182],[0,2.971],[0.92,2.182],[1.604,1.183],[2.077,0],[1.604,-1.209],[0.894,-2.209],[0,-2.945],[-0.868,-2.182],[-1.578,-1.209],[-2.104,0],[-1.578,1.209]],"v":[[2.238,8.874],[0.897,16.565],[2.238,24.296],[5.985,29.384],[11.546,31.159],[17.068,29.344],[20.775,24.256],[22.116,16.565],[20.775,8.874],[17.068,3.786],[11.546,1.972],[5.985,3.786]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-0.789,-2.051],[0,-2.735],[0.789,-2.051],[1.446,-1.157],[1.972,0],[1.446,1.131],[0.815,2.051],[0,2.708],[-0.789,2.051],[-1.446,1.131],[-1.919,0],[-1.446,-1.157]],"o":[[0.815,2.051],[0,2.735],[-0.789,2.051],[-1.446,1.131],[-1.946,0],[-1.446,-1.157],[-0.789,-2.077],[0,-2.735],[0.815,-2.051],[1.473,-1.157],[1.946,0],[1.446,1.131]],"v":[[19.947,9.387],[21.17,16.565],[19.986,23.744],[16.634,28.556],[11.507,30.252],[6.419,28.556],[3.027,23.744],[1.843,16.565],[3.027,9.387],[6.419,4.615],[11.507,2.879],[16.595,4.615]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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,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":"Vector","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.25,150.5,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],[0,4.314],[0,0],[6.829,0],[0,0],[0,-4.314],[0,0],[-4.553,0]],"o":[[4.553,0],[0,0],[0,-4.314],[0,0],[-4.553,0],[0,0],[0,4.314],[0,0]],"v":[[48.319,100.5],[57.25,91.034],[57.25,-94.611],[46.743,-102.5],[-51.497,-102.5],[-56.75,-95.67],[-56.75,93.67],[-51.497,100.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.109,0.929,0.8,0.816,0.321,0.775,0.733,0.847,0.534,0.62,0.667,0.878,0.767,0.439,0.59,0.914,1,0.259,0.514,0.949],"ix":9}},"s":{"a":0,"k":[-63.755,106.612],"ix":5},"e":{"a":0,"k":[133.428,106.612],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Folded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Ellipse 7590","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[86,6,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7590","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Ellipse 7594","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,160,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7594","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Ellipse 7593","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,128,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7593","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Ellipse 7592","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,96,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7592","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Ellipse 7591","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,64,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7591","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Ellipse 7589","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,32,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7589","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Rectangle 3470513","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,162.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470513","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Rectangle 3470511","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,130.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470511","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Rectangle 3470509","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,98.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470509","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Rectangle 3470507","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,66.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470507","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Rectangle 3470505","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,34.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470505","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Rectangle 3470512","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,156,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470512","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470510","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,124,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470510","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470508","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,92,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470508","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470506","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,60,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470506","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470504","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,28,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470504","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470503","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[37,6.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[74,13],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470503","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Unfolded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle 3470520","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,141.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470520","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle 3470519","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,132.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470519","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Rectangle 3470518","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,123.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470518","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Rectangle 3470517","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,114.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470517","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Rectangle 3470516","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,105.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470516","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Rectangle 3470515","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,96.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470515","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ellipse 7584","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296.494,74.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7584","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ellipse 7598","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,209.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7598","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Ellipse 7597","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,182.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7597","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Ellipse 7596","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,155.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7596","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Ellipse 7595","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,128.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7595","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Ellipse 7579","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,101.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7579","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470514","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[212.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470514","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470502","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[32,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470502","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470530","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,210.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470530","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470528","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,183.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470528","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470526","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,156.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470526","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Rectangle 3470524","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,129.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470524","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Rectangle 3470522","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,102.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470522","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Rectangle 3470529","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,204.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470529","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Rectangle 3470527","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,177.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470527","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Rectangle 3470525","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,150.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470525","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Rectangle 3470523","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,123.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470523","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Rectangle 3470521","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,96.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470521","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 4","sr":1,"ks":{"o":{"a":0,"k":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":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[88,88,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":608,"st":30,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[0,0,0],"to":[-10.833,0,0],"ti":[10.833,0,0]},{"t":80,"s":[-65,0,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,"ip":0,"op":608,"st":40,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[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.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,0],[5.09,0],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[5.089,0],[0,0]],"v":[[63.495,137.576],[54.264,146.808],[-54.501,114.37],[-54.56,-114.429],[54.282,-146.679],[63.915,-137.047]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,0],[5.09,0],[0,0],[-2.838,0],[0,0],[0,-9.436]],"o":[[0,8.464],[0,0],[-2.838,0],[0,0],[5.089,0],[0,0]],"v":[[63.623,136.911],[54.466,146.518],[-54.319,117.62],[-54.594,-117.179],[54.309,-145.697],[63.951,-135.939]],"c":true}]},{"t":80,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[0,0],[0,0],[5.089,0],[0,0]],"v":[[63.599,105.138],[54.368,114.37],[-60.431,114.394],[-60.313,-114.39],[54.31,-114.429],[63.943,-104.797]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"op":608,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Swipe","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":190,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":211,"s":[100]},{"t":221,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":180,"s":[206,226.954,0],"to":[0,0,0],"ti":[0,0,0]},{"t":200,"s":[206,205.954,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-0.546,55.954,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":[[-6.627,0],[0,-6.627],[6.627,0],[0,6.627]],"o":[[6.627,0],[0,6.627],[-6.627,0],[0,-6.627]],"v":[[0,-12],[12,0],[0,12],[-12,0]],"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":[-0.546,55.954],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":780,"st":180,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Mask","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],[0,0],[2.366,3.265],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-1.491,-2.057],[0,0],[0,0],[0,0]],"v":[[61.778,-30],[61.807,42.127],[58.087,34.369],[54.722,30.063],[-56.028,30],[-56.028,-30.127]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":[-2.722,-132.437],"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":200,"op":249,"st":200,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Lockscreen","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":214,"s":[100]},{"t":224,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.644,"y":1},"o":{"x":0.7,"y":0},"t":200,"s":[206,150,0],"to":[0,0,0],"ti":[0,0,0]},{"t":230,"s":[206,-53,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":51,"op":249,"st":51,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Folded Gmail UI","parent":2,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[67.273,-5.682,0],"ix":2,"l":2},"a":{"a":0,"k":[46,83,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":209,"s":[75,75,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":214,"s":[90.455,90.455,100]},{"t":239,"s":[113.636,113.636,100]}],"ix":6,"l":2}},"ao":0,"w":92,"h":166,"ip":208,"op":606,"st":208,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":608,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[206,150,0],"to":[1.444,0,0],"ti":[-2,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[214.667,150,0],"to":[2,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[218,150,0],"to":[1.083,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[221.167,150,0],"to":[1.083,0,0],"ti":[-1.111,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[224.5,150,0],"to":[1.111,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[227.833,150,0],"to":[1.333,0,0],"ti":[-1.528,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[232.5,150,0],"to":[1.528,0,0],"ti":[-1.583,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[237,150,0],"to":[1.583,0,0],"ti":[-1.889,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[242,150,0],"to":[1.889,0,0],"ti":[-2.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[248.333,150,0],"to":[2.167,0,0],"ti":[-2.278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[255,150,0],"to":[2.278,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[262,150,0],"to":[2.5,0,0],"ti":[-3.556,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[270,150,0],"to":[3.556,0,0],"ti":[-2.222,0,0]},{"t":61,"s":[283.333,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[311.96,210.22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":[43.52,5.61],"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":0,"op":608,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"Unfolded Gmail UI","parent":2,"tt":1,"tp":10,"refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":50,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"t":61,"s":[0,100,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-2.282,113.897],[-17.976,113.897],[-121.273,113.897],[-130.36,105.242],[-130.36,-104.809],[-121.273,-113.897],[-1.197,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-8.034,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.243],[118.937,113.897],[20.423,113.897],[-1.182,113.897],[-16.193,117.028],[-121.36,141.834],[-130.185,134.804],[-130.289,-134.192],[-121.277,-142.03],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"t":61,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-1.125,113.897],[-16.101,117.189],[-121.089,144.98],[-130.176,136.326],[-130.286,-135.704],[-121.198,-144.793],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[99,99,100]},{"t":61,"s":[-1,99,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[116.74,102.33,0],"ix":1,"l":2},"s":{"a":0,"k":[114.5,114.5,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.717,-109.174],[-119.283,-109.174],[-119.283,299.701],[115.717,299.701]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.17,0],[0,0],[0,4.18],[0,0],[-4.17,0],[0,0],[0,-4.18]],"o":[[0,4.18],[0,0],[-4.18,0],[0,0],[0,-4.18],[0,0],[4.18,0],[0,0]],"v":[[112.07,92.13],[104.12,99.71],[-106.16,99.71],[-114.11,92.13],[-114.11,-91.75],[-106.16,-99.71],[104.12,-99.71],[112.07,-91.75]],"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,0],[0.055,2.749],[0,0],[5.7,0],[0,0],[1.89,-1.05],[0.88,0.35],[0,0],[2.17,0],[0,0],[0,-5.7],[0,0],[-5.7,0],[0,0],[-1.89,1.05],[-0.85,-0.29],[0,0],[-2.17,0],[0,0],[0,5.7],[0,0],[0.055,2.493]],"o":[[0,0],[0,0],[0,-5.71],[0,0],[-2.17,0],[-0.88,0.35],[0,0],[-1.89,-1.06],[0,0],[-5.71,0],[0,0],[0,5.71],[0,0],[2.17,0],[0.83,-0.33],[0,0],[1.89,1.05],[0,0],[5.71,0],[0,0],[-0.069,-5.452],[0,0]],"v":[[114.45,-15.54],[114.45,-36.12],[114.45,-91.75],[104.12,-102.08],[6.42,-102.08],[0.23,-100.48],[-2.52,-100.47],[-2.55,-100.47],[-8.74,-102.08],[-106.16,-102.08],[-116.49,-91.75],[-116.49,91.75],[-106.16,102.08],[-8.54,102.08],[-2.35,100.48],[0.25,100.42],[0.35,100.48],[7.83,102.08],[104.12,102.08],[114.45,91.75],[114.45,31.38],[114.45,-0.88]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.133,-0.038],[0,0],[0,0],[0,0],[0,-1.46],[0,0],[1.133,-0.038],[0,0],[0,0],[0,0],[0,-1.46],[0,0]],"o":[[0,0],[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46],[0,0],[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46]],"v":[[115.165,-15.899],[114.482,-15.883],[114.517,-0.46],[115.165,-0.477],[117.209,2.203],[117.209,29.104],[115.165,31.783],[114.399,31.826],[114.42,-35.723],[115.165,-35.719],[117.209,-33.039],[117.209,-18.579]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[116.74,102.33],"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":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":608,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":0,"k":[99,99,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":607,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":".black","cl":"black","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":[[15.291,0],[0,0],[0,15.652],[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0],[15.185,0],[0,0],[0,15.544]],"v":[[178.179,150],[-178.179,150],[-206,121.522],[-206,-121.522],[-178.179,-150],[178.286,-150],[206,-121.522],[206,121.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":608,"st":40,"ct":1,"bm":0}],"markers":[{"tm":200,"cm":"swipe up\r","dr":0},{"tm":390,"cm":"End","dr":0}],"props":{}}
\ No newline at end of file
diff --git a/res/raw/fold_setting_sleep_on_fold_lottie.json b/res/raw/fold_setting_sleep_on_fold_lottie.json
index 0030e11..5204885 100644
--- a/res/raw/fold_setting_sleep_on_fold_lottie.json
+++ b/res/raw/fold_setting_sleep_on_fold_lottie.json
@@ -1 +1 @@
-{"v":"5.9.0","fr":60,"ip":0,"op":244,"w":412,"h":300,"nm":"Foldable_FoldingSetting_EDU_03_412x300","ddd":0,"assets":[{"id":"comp_0","nm":"Unfolded YouTube UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 9","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[156.94,145.03,0],"ix":2,"l":2},"a":{"a":0,"k":[43,12,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":86,"h":24,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[176.64,71.83,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":[[-8.5,0],[0,-10.8],[0,0],[-6.1,0],[-2.3,-1.6]],"o":[[10.8,0],[0,0],[2.1,-5.2],[3.1,0],[2.6,-7.6]],"v":[[10.15,-9.75],[29.65,9.75],[-29.65,9.65],[-16.35,0.65],[-8.15,3.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"▽ Group 8","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[251.49,96.13,0],"ix":2,"l":2},"a":{"a":0,"k":[51.5,14,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":103,"h":28,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"▽ Group 7","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.22,226.963,0],"ix":2,"l":2},"a":{"a":0,"k":[2,4,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":4,"h":8,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Vector 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[166.369,227.275,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],[0,0]],"o":[[0,0],[0,0]],"v":[[44,0],[-44,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.933333337307,0.403921574354,0.360784322023,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Vector 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256.869,227.275,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],[0,0]],"o":[[0,0],[0,0]],"v":[[46.5,0],[-46.5,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"▽ Group 5","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.856,176.561,0],"ix":2,"l":2},"a":{"a":0,"k":[21,25.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":51,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"▽ Group 2","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[282.536,170.581,0],"ix":2,"l":2},"a":{"a":0,"k":[21,31.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":63,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Rectangle 3470504","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204.99,132.58,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[216,155],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,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":"Rectangle 3470504","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_1","nm":"▽ Group 9","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.95,11.95,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":[[-8.9,0],[0,-11.8],[0.1,-0.9],[0,0],[-4.7,0],[-1.7,-0.8],[-7.3,0],[-3.1,-3.3]],"o":[[11.7,0],[0,0.9],[0,0],[2.1,-3.8],[1.9,0],[2.6,-6.5],[4.9,0],[3.3,-7.6]],"v":[[21.75,-11.95],[42.95,9.25],[42.85,11.95],[-42.95,11.95],[-32.05,5.55],[-26.65,6.75],[-10.45,-4.25],[2.05,1.05]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_2","nm":"▽ Group 8","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[51.5,14.05,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":[[-3.1,-11.8],[-2.9,0],[-1.6,-5.9],[0,0],[-8.5,0],[-3.2,-2.2],[-12.1,0]],"o":[[2.2,-1.6],[6.4,0],[0,0],[2.7,-7.6],[4.1,0],[3.6,-10.8],[12.7,0]],"v":[[30.2,6.45],[38.1,4.05],[51.5,14.05],[-51.5,14.05],[-33.1,1.05],[-21.9,4.65],[3.9,-14.05]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_3","nm":"▽ Group 7","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.46,3.883,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],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.883],[0,-3.883]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,3.883,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],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.883],[0,-3.883]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_4","nm":"▽ Group 5","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 6","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,0],"ix":2,"l":2},"a":{"a":0,"k":[21,25.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":51,"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_5","nm":"▽ Group 6","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-20.866,25.481],[20.866,25.481],[7.704,3.652],[17.656,3.652],[0,-25.481],[-17.656,3.652],[-7.704,3.652]],"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,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.057,23.876],[-17.977,23.876],[-4.735,2.046],[-14.687,2.046],[0.08,-22.431],[14.847,2.046],[4.896,2.046]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_6","nm":"▽ Group 2","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 4","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,0],"ix":2,"l":2},"a":{"a":0,"k":[21,25.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":51,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"▽ Group 3","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.863,56.741,0],"ix":2,"l":2},"a":{"a":0,"k":[6.5,6.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":13,"h":13,"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_7","nm":"▽ Group 4","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-20.866,25.481],[20.866,25.481],[7.704,3.652],[17.656,3.652],[0,-25.481],[-17.656,3.652],[-7.704,3.652]],"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,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.057,23.876],[-17.977,23.876],[-4.735,2.046],[-14.687,2.046],[0.08,-22.431],[14.847,2.046],[4.896,2.046]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_8","nm":"▽ Group 3","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6.661,6.26,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.661,6.26],[6.661,6.26],[6.661,-6.26],[5.056,-6.26],[5.056,4.655],[-5.056,4.655],[-5.056,-6.26],[-6.661,-6.26]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 4","sr":1,"ks":{"o":{"a":0,"k":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":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[88,88,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[0,0,0],"to":[-10.833,0,0],"ti":[10.833,0,0]},{"t":80,"s":[-65,0,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,"ip":0,"op":244,"st":40,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[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.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.839],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.495,137.576],[54.264,146.808],[-54.501,114.37],[-59.648,109.223],[-59.708,-109.282],[-54.56,-114.429],[54.282,-146.679],[63.915,-137.047]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.838],[0,0],[-2.838,0],[0,0],[0,-9.436]],"o":[[0,8.464],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.623,136.911],[54.466,146.518],[-54.319,117.62],[-59.648,109.223],[-59.708,-109.282],[-54.594,-117.179],[54.309,-145.697],[63.951,-135.939]],"c":true}]},{"t":80,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.838],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.599,105.138],[54.368,114.37],[-54.501,114.37],[-59.648,109.223],[-59.708,-109.282],[-54.56,-114.429],[54.31,-114.429],[63.943,-104.797]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"op":245,"st":39,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".black 2","cl":"black","parent":2,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":245,"st":39,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Vector","parent":2,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"t":90,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[65,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.918,-0.923],[-1.289,0],[0,0],[-0.918,0.923],[0,1.296],[0,0],[0.918,0.923],[1.289,0],[0,0],[0,0],[2.891,2.911],[4.109,0],[2.896,-2.911],[0,-4.13],[0,0],[0,0],[0.918,-0.923],[0,-1.296],[0,0]],"o":[[0.918,0.923],[0,0],[1.289,0],[0.918,-0.923],[0,0],[0,-1.296],[-0.918,-0.923],[0,0],[0,0],[0,-4.13],[-2.891,-2.911],[-4.109,0],[-2.896,2.911],[0,0],[0,0],[-1.289,0],[-0.918,0.923],[0,0],[0,1.296]],"v":[[-23.623,31.615],[-20.312,33],[20.312,33],[23.623,31.615],[25,28.286],[25,-5.814],[23.623,-9.144],[20.312,-10.529],[14.844,-10.529],[14.844,-18.071],[10.508,-28.633],[0.008,-33],[-10.5,-28.633],[-14.844,-18.071],[-14.844,-10.529],[-20.312,-10.529],[-23.623,-9.144],[-25,-5.814],[-25,28.286]],"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,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.312,28.286],[-20.312,28.286],[-20.312,-5.814],[20.312,-5.814]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.172,-1.154],[1.658,0],[1.181,1.152],[0,1.598],[-1.172,1.283],[-1.658,0],[-1.181,-1.283],[0,-1.571]],"o":[[-1.172,1.154],[-1.658,0],[-1.181,-1.152],[0,-1.598],[1.172,-1.283],[1.658,0],[1.181,1.283],[0,1.621]],"v":[[4.258,15.555],[0.013,17.286],[-4.245,15.557],[-6.016,11.432],[-4.258,7.111],[-0.013,5.186],[4.245,7.111],[6.016,11.393]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.979,1.986],[-2.819,0],[-1.973,-1.986],[0,-2.837]],"o":[[0,0],[0,0],[0,-2.837],[1.979,-1.986],[2.819,0],[1.973,1.986],[0,0]],"v":[[10.156,-10.529],[-10.156,-10.529],[-10.156,-18.071],[-7.188,-25.307],[0.009,-28.286],[7.197,-25.307],[10.156,-18.071]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,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":"Vector","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":245,"st":39,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 1","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[206,150,0],"to":[1.444,0,0],"ti":[-2,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[214.667,150,0],"to":[2,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[218,150,0],"to":[1.083,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[221.167,150,0],"to":[1.083,0,0],"ti":[-1.111,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[224.5,150,0],"to":[1.111,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[227.833,150,0],"to":[1.333,0,0],"ti":[-1.528,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[232.5,150,0],"to":[1.528,0,0],"ti":[-1.583,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[237,150,0],"to":[1.583,0,0],"ti":[-1.889,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[242,150,0],"to":[1.889,0,0],"ti":[-2.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[248.333,150,0],"to":[2.167,0,0],"ti":[-2.278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[255,150,0],"to":[2.278,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[262,150,0],"to":[2.5,0,0],"ti":[-3.556,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[270,150,0],"to":[3.556,0,0],"ti":[-2.222,0,0]},{"t":61,"s":[283.333,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[311.96,210.22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":[43.52,5.61],"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":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Unfolded YouTube UI","parent":2,"tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":50,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"t":61,"s":[0,100,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-2.282,113.897],[-17.976,113.897],[-121.273,113.897],[-130.36,105.242],[-130.36,-104.809],[-121.273,-113.897],[-1.197,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-8.034,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.243],[118.937,113.897],[20.423,113.897],[-1.182,113.897],[-16.193,117.028],[-121.36,141.834],[-130.185,134.804],[-130.289,-134.192],[-121.277,-142.03],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"t":61,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-1.125,113.897],[-16.101,117.189],[-121.089,144.98],[-130.176,136.326],[-130.286,-135.704],[-121.198,-144.793],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"st":40,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[99,99,100]},{"t":61,"s":[-1,99,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":40,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".grey601","cl":"grey601","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[116.74,102.33,0],"ix":1,"l":2},"s":{"a":0,"k":[114.5,114.5,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.717,-109.174],[-119.283,-109.174],[-119.283,299.701],[115.717,299.701]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.17,0],[0,0],[0,4.18],[0,0],[-4.17,0],[0,0],[0,-4.18]],"o":[[0,4.18],[0,0],[-4.18,0],[0,0],[0,-4.18],[0,0],[4.18,0],[0,0]],"v":[[112.07,92.13],[104.12,99.71],[-106.16,99.71],[-114.11,92.13],[-114.11,-91.75],[-106.16,-99.71],[104.12,-99.71],[112.07,-91.75]],"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,0],[0.055,2.749],[0,0],[5.7,0],[0,0],[1.89,-1.05],[0.88,0.35],[0,0],[2.17,0],[0,0],[0,-5.7],[0,0],[-5.7,0],[0,0],[-1.89,1.05],[-0.85,-0.29],[0,0],[-2.17,0],[0,0],[0,5.7],[0,0],[0.055,2.493]],"o":[[0,0],[0,0],[0,-5.71],[0,0],[-2.17,0],[-0.88,0.35],[0,0],[-1.89,-1.06],[0,0],[-5.71,0],[0,0],[0,5.71],[0,0],[2.17,0],[0.83,-0.33],[0,0],[1.89,1.05],[0,0],[5.71,0],[0,0],[-0.069,-5.452],[0,0]],"v":[[114.45,-15.54],[114.45,-36.12],[114.45,-91.75],[104.12,-102.08],[6.42,-102.08],[0.23,-100.48],[-2.52,-100.47],[-2.55,-100.47],[-8.74,-102.08],[-106.16,-102.08],[-116.49,-91.75],[-116.49,91.75],[-106.16,102.08],[-8.54,102.08],[-2.35,100.48],[0.25,100.42],[0.35,100.48],[7.83,102.08],[104.12,102.08],[114.45,91.75],[114.45,31.38],[114.45,-0.88]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[116.74,102.33],"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":247,"st":30,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":0,"k":[99,99,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":244,"st":40,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".black","cl":"black","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":[[15.291,0],[0,0],[0,15.652],[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0],[15.185,0],[0,0],[0,15.544]],"v":[[178.179,150],[-178.179,150],[-206,121.522],[-206,-121.522],[-178.179,-150],[178.286,-150],[206,-121.522],[206,121.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":244,"st":40,"bm":0}],"markers":[]}
+{"v":"5.12.1","fr":60,"ip":0,"op":241,"w":412,"h":300,"nm":"Foldable_FoldingSetting_EDU_03b_412x300_export","ddd":0,"assets":[{"id":"comp_0","nm":"Lockscreen_Locked_Black","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"lock","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.5,213.75,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.386,-0.392],[-0.541,0],[0,0],[-0.386,0.392],[0,0.55],[0,0],[0.386,0.392],[0.541,0],[0,0],[0,0],[1.214,1.235],[1.726,0],[1.216,-1.235],[0,-1.752],[0,0],[0,0],[0.386,-0.392],[0,-0.55],[0,0]],"o":[[0.386,0.392],[0,0],[0.541,0],[0.386,-0.392],[0,0],[0,-0.55],[-0.386,-0.392],[0,0],[0,0],[0,-1.752],[-1.214,-1.235],[-1.726,0],[-1.216,1.235],[0,0],[0,0],[-0.541,0],[-0.386,0.392],[0,0],[0,0.55]],"v":[[-9.922,13.413],[-8.531,14],[8.531,14],[9.922,13.413],[10.5,12],[10.5,-2.467],[9.922,-3.879],[8.531,-4.467],[6.234,-4.467],[6.234,-7.667],[4.413,-12.148],[0.003,-14],[-4.41,-12.148],[-6.234,-7.667],[-6.234,-4.467],[-8.531,-4.467],[-9.922,-3.879],[-10.5,-2.467],[-10.5,12]],"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,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.531,12],[-8.531,12],[-8.531,-2.467],[8.531,-2.467]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.492,-0.49],[0.696,0],[0.496,0.489],[0,0.678],[-0.492,0.544],[-0.696,0],[-0.496,-0.544],[0,-0.667]],"o":[[-0.492,0.49],[-0.696,0],[-0.496,-0.489],[0,-0.678],[0.492,-0.544],[0.696,0],[0.496,0.544],[0,0.688]],"v":[[1.788,6.599],[0.006,7.333],[-1.783,6.6],[-2.527,4.85],[-1.788,3.017],[-0.006,2.2],[1.783,3.017],[2.527,4.833]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.831,0.843],[-1.184,0],[-0.829,-0.843],[0,-1.204]],"o":[[0,0],[0,0],[0,-1.204],[0.831,-0.843],[1.184,0],[0.829,0.843],[0,0]],"v":[[4.266,-4.467],[-4.266,-4.467],[-4.266,-7.667],[-3.019,-10.736],[0.004,-12],[3.023,-10.736],[4.266,-7.667]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,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":"Vector","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"clock","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.116,143.317,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.92,-2.182],[0,-2.945],[0,0],[-0.894,-2.182],[-1.578,-1.209],[-2.104,0],[-1.604,1.209],[-0.868,2.182],[0,2.919],[0.894,2.182],[1.604,1.21],[2.103,0],[1.604,-1.21]],"o":[[-0.894,2.182],[0,0],[0,2.971],[0.92,2.182],[1.604,1.183],[2.077,0],[1.604,-1.209],[0.894,-2.209],[0,-2.945],[-0.868,-2.182],[-1.578,-1.21],[-2.104,0],[-1.578,1.21]],"v":[[-20.775,-24.257],[-22.116,-16.565],[-22.116,-16.565],[-20.775,-8.835],[-17.028,-3.747],[-11.467,-1.972],[-5.945,-3.786],[-2.238,-8.874],[-0.897,-16.565],[-2.238,-24.257],[-5.945,-29.344],[-11.467,-31.159],[-17.028,-29.344]],"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.789,-2.051],[0,-2.735],[0,0],[0.789,-2.051],[1.446,-1.157],[1.972,0],[1.446,1.131],[0.815,2.051],[0,2.708],[-0.789,2.051],[-1.446,1.131],[-1.92,0],[-1.446,-1.157]],"o":[[0.815,2.051],[0,0],[0,2.735],[-0.789,2.051],[-1.446,1.131],[-1.946,0],[-1.446,-1.157],[-0.789,-2.077],[0,-2.735],[0.815,-2.051],[1.472,-1.157],[1.946,0],[1.446,1.131]],"v":[[-3.066,-23.744],[-1.843,-16.565],[-1.843,-16.565],[-3.027,-9.387],[-6.379,-4.575],[-11.507,-2.879],[-16.594,-4.575],[-19.986,-9.387],[-21.17,-16.565],[-19.986,-23.744],[-16.594,-28.516],[-11.507,-30.252],[-6.419,-28.516]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-1.394,-0.763],[-1.604,0],[0,0],[-0.868,0.316],[-0.657,0.473],[-0.394,0.526],[0,0],[0,0],[0,0],[-0.289,0.92],[0,1.157],[0.815,1.367],[1.42,0.815],[1.814,0],[1.42,-0.815],[0.815,-1.394],[0,-1.735],[-0.841,-1.367]],"o":[[1.394,0.763],[0,0],[1.078,0],[0.868,-0.316],[0.684,-0.5],[0,0],[0,0],[0,0],[0.526,-0.789],[0.316,-0.92],[0,-1.709],[-0.815,-1.394],[-1.42,-0.841],[-1.762,0],[-1.42,0.815],[-0.815,1.367],[0,1.735],[0.868,1.341]],"v":[[6.616,-14.317],[11.112,-13.173],[11.112,-13.173],[14.031,-13.647],[16.318,-14.83],[17.936,-16.368],[8.746,-2.524],[9.574,-2.012],[19.04,-16.447],[20.263,-19.011],[20.736,-22.127],[19.513,-26.741],[16.161,-30.054],[11.309,-31.317],[6.537,-30.094],[3.184,-26.781],[1.962,-22.127],[3.224,-17.473]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-0.736,-1.262],[0,-1.525],[0,0],[0.815,-1.236],[1.288,-0.657],[1.473,0],[1.315,0.71],[0.789,1.21],[0,1.551],[-0.736,1.262],[-1.262,0.736],[-1.604,0],[-1.288,-0.763]],"o":[[0.736,1.236],[0,0],[0,1.657],[-0.815,1.21],[-1.288,0.657],[-1.473,0],[-1.288,-0.71],[-0.763,-1.236],[0,-1.551],[0.736,-1.262],[1.288,-0.736],[1.63,0],[1.288,0.763]],"v":[[18.724,-26.268],[19.829,-22.127],[19.829,-22.127],[18.606,-17.788],[15.451,-14.988],[11.309,-14.002],[7.129,-15.067],[4.013,-17.946],[2.869,-22.127],[3.973,-26.347],[6.971,-29.344],[11.309,-30.449],[15.687,-29.305]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-0.789,1.288],[0,1.788],[0,0],[0.605,0.973],[1.131,0.578],[1.578,0.079],[-0.947,0.552],[-0.473,0.92],[0,1.209],[0.736,1.104],[1.262,0.578],[1.63,0],[1.525,-1.078],[0.605,-1.709],[0,0],[-1.367,0.973],[-1.972,0],[-1.104,-0.526],[-0.631,-0.999],[0,-1.394],[0.526,-0.894],[1.052,-0.526],[1.657,0],[0,0],[0,0],[0,0],[-1.21,-0.526],[-0.579,-0.973],[0,-1.262],[0.684,-1.157],[1.262,-0.631],[1.683,0],[1.236,0.552],[0.815,0.947],[0.368,1.209],[0,0],[-0.894,-1.025],[-1.367,-0.631],[-1.814,0],[-1.367,0.684]],"o":[[0.815,-1.288],[0,0],[0,-1.367],[-0.579,-0.999],[-1.104,-0.578],[1.446,-0.158],[0.947,-0.552],[0.473,-0.92],[0,-1.604],[-0.71,-1.131],[-1.262,-0.578],[-2.235,0],[-1.499,1.078],[0,0],[0.578,-1.578],[1.367,-0.973],[1.446,0],[1.104,0.526],[0.657,0.973],[0,1.183],[-0.5,0.894],[-1.052,0.526],[0,0],[0,0],[0,0],[1.841,0],[1.209,0.526],[0.605,0.947],[0,1.63],[-0.684,1.157],[-1.236,0.605],[-1.63,0],[-1.236,-0.552],[-0.789,-0.947],[0,0],[0.342,1.236],[0.894,1.025],[1.367,0.605],[1.814,0],[1.393,-0.71]],"v":[[-3.46,27.293],[-2.238,22.679],[-2.238,22.679],[-3.145,19.169],[-5.709,16.802],[-9.732,15.816],[-6.142,14.751],[-4.013,12.542],[-3.303,9.348],[-4.407,5.285],[-7.365,2.721],[-11.704,1.854],[-17.344,3.471],[-20.499,7.652],[-19.631,8.046],[-16.713,4.22],[-11.704,2.761],[-7.878,3.55],[-5.275,5.837],[-4.289,9.387],[-5.078,12.503],[-7.405,14.633],[-11.467,15.422],[-14.425,15.422],[-14.425,16.329],[-11.388,16.329],[-6.813,17.118],[-4.131,19.366],[-3.224,22.679],[-4.249,26.86],[-7.168,29.542],[-11.546,30.449],[-15.845,29.621],[-18.922,27.372],[-20.657,24.138],[-21.525,24.533],[-19.671,27.925],[-16.279,30.409],[-11.507,31.317],[-6.734,30.291]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0.92,-2.182],[0,-2.945],[-0.894,-2.182],[-1.578,-1.209],[-2.104,0],[-1.604,1.209],[-0.868,2.182],[0,2.919],[0.894,2.182],[1.604,1.209],[2.104,0],[1.604,-1.209]],"o":[[-0.894,2.182],[0,2.971],[0.92,2.182],[1.604,1.183],[2.077,0],[1.604,-1.209],[0.894,-2.209],[0,-2.945],[-0.868,-2.182],[-1.578,-1.209],[-2.104,0],[-1.578,1.209]],"v":[[2.238,8.874],[0.897,16.565],[2.238,24.296],[5.985,29.384],[11.546,31.159],[17.068,29.344],[20.775,24.256],[22.116,16.565],[20.775,8.874],[17.068,3.786],[11.546,1.972],[5.985,3.786]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-0.789,-2.051],[0,-2.735],[0.789,-2.051],[1.446,-1.157],[1.972,0],[1.446,1.131],[0.815,2.051],[0,2.708],[-0.789,2.051],[-1.446,1.131],[-1.919,0],[-1.446,-1.157]],"o":[[0.815,2.051],[0,2.735],[-0.789,2.051],[-1.446,1.131],[-1.946,0],[-1.446,-1.157],[-0.789,-2.077],[0,-2.735],[0.815,-2.051],[1.473,-1.157],[1.946,0],[1.446,1.131]],"v":[[19.947,9.387],[21.17,16.565],[19.986,23.744],[16.634,28.556],[11.507,30.252],[6.419,28.556],[3.027,23.744],[1.843,16.565],[3.027,9.387],[6.419,4.615],[11.507,2.879],[16.595,4.615]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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,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":"Vector","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.25,150.5,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],[0,4.314],[0,0],[6.829,0],[0,0],[0,-4.314],[0,0],[-4.553,0]],"o":[[4.553,0],[0,0],[0,-4.314],[0,0],[-4.553,0],[0,0],[0,4.314],[0,0]],"v":[[48.319,100.5],[57.25,91.034],[57.25,-94.611],[46.743,-102.5],[-51.497,-102.5],[-56.75,-95.67],[-56.75,93.67],[-51.497,100.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Unfolded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle 3470520","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,141.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470520","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle 3470519","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,132.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470519","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Rectangle 3470518","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,123.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470518","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Rectangle 3470517","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,114.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470517","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Rectangle 3470516","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,105.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470516","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Rectangle 3470515","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,96.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470515","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ellipse 7584","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296.494,74.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7584","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ellipse 7598","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,209.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7598","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Ellipse 7597","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,182.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7597","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Ellipse 7596","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,155.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7596","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Ellipse 7595","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,128.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7595","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Ellipse 7579","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,101.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7579","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470514","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[212.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470514","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470502","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[32,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470502","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470530","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,210.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470530","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470528","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,183.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470528","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470526","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,156.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470526","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Rectangle 3470524","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,129.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470524","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Rectangle 3470522","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,102.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470522","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Rectangle 3470529","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,204.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470529","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Rectangle 3470527","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,177.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470527","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Rectangle 3470525","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,150.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470525","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Rectangle 3470523","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,123.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470523","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Rectangle 3470521","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,96.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470521","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 4","sr":1,"ks":{"o":{"a":0,"k":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":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[88,88,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":241,"st":30,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[0,0,0],"to":[-10.833,0,0],"ti":[10.833,0,0]},{"t":80,"s":[-65,0,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,"ip":0,"op":241,"st":40,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[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.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,0],[5.09,0],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[5.089,0],[0,0]],"v":[[63.495,137.576],[54.264,146.808],[-54.501,114.37],[-54.56,-114.429],[54.282,-146.679],[63.915,-137.047]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,0],[5.09,0],[0,0],[-2.838,0],[0,0],[0,-9.436]],"o":[[0,8.464],[0,0],[-2.838,0],[0,0],[5.089,0],[0,0]],"v":[[63.623,136.911],[54.466,146.518],[-54.319,117.62],[-54.594,-117.179],[54.309,-145.697],[63.951,-135.939]],"c":true}]},{"t":80,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[0,0],[0,0],[5.089,0],[0,0]],"v":[[63.599,105.138],[54.368,114.37],[-60.431,114.394],[-60.313,-114.39],[54.31,-114.429],[63.943,-104.797]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"op":241,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Lockscreen","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"t":90,"s":[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":51,"op":651,"st":51,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":241,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[206,150,0],"to":[1.444,0,0],"ti":[-2,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[214.667,150,0],"to":[2,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[218,150,0],"to":[1.083,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[221.167,150,0],"to":[1.083,0,0],"ti":[-1.111,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[224.5,150,0],"to":[1.111,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[227.833,150,0],"to":[1.333,0,0],"ti":[-1.528,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[232.5,150,0],"to":[1.528,0,0],"ti":[-1.583,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[237,150,0],"to":[1.583,0,0],"ti":[-1.889,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[242,150,0],"to":[1.889,0,0],"ti":[-2.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[248.333,150,0],"to":[2.167,0,0],"ti":[-2.278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[255,150,0],"to":[2.278,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[262,150,0],"to":[2.5,0,0],"ti":[-3.556,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[270,150,0],"to":[3.556,0,0],"ti":[-2.222,0,0]},{"t":61,"s":[283.333,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[311.96,210.22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":[43.52,5.61],"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":0,"op":241,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Unfolded Gmail UI","parent":2,"tt":1,"tp":7,"refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":50,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"t":61,"s":[0,100,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-2.282,113.897],[-17.976,113.897],[-121.273,113.897],[-130.36,105.242],[-130.36,-104.809],[-121.273,-113.897],[-1.197,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-8.034,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.243],[118.937,113.897],[20.423,113.897],[-1.182,113.897],[-16.193,117.028],[-121.36,141.834],[-130.185,134.804],[-130.289,-134.192],[-121.277,-142.03],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"t":61,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-1.125,113.897],[-16.101,117.189],[-121.089,144.98],[-130.176,136.326],[-130.286,-135.704],[-121.198,-144.793],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[99,99,100]},{"t":61,"s":[-1,99,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[116.74,102.33,0],"ix":1,"l":2},"s":{"a":0,"k":[114.5,114.5,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.717,-109.174],[-119.283,-109.174],[-119.283,299.701],[115.717,299.701]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.17,0],[0,0],[0,4.18],[0,0],[-4.17,0],[0,0],[0,-4.18]],"o":[[0,4.18],[0,0],[-4.18,0],[0,0],[0,-4.18],[0,0],[4.18,0],[0,0]],"v":[[112.07,92.13],[104.12,99.71],[-106.16,99.71],[-114.11,92.13],[-114.11,-91.75],[-106.16,-99.71],[104.12,-99.71],[112.07,-91.75]],"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,0],[0.055,2.749],[0,0],[5.7,0],[0,0],[1.89,-1.05],[0.88,0.35],[0,0],[2.17,0],[0,0],[0,-5.7],[0,0],[-5.7,0],[0,0],[-1.89,1.05],[-0.85,-0.29],[0,0],[-2.17,0],[0,0],[0,5.7],[0,0],[0.055,2.493]],"o":[[0,0],[0,0],[0,-5.71],[0,0],[-2.17,0],[-0.88,0.35],[0,0],[-1.89,-1.06],[0,0],[-5.71,0],[0,0],[0,5.71],[0,0],[2.17,0],[0.83,-0.33],[0,0],[1.89,1.05],[0,0],[5.71,0],[0,0],[-0.069,-5.452],[0,0]],"v":[[114.45,-15.54],[114.45,-36.12],[114.45,-91.75],[104.12,-102.08],[6.42,-102.08],[0.23,-100.48],[-2.52,-100.47],[-2.55,-100.47],[-8.74,-102.08],[-106.16,-102.08],[-116.49,-91.75],[-116.49,91.75],[-106.16,102.08],[-8.54,102.08],[-2.35,100.48],[0.25,100.42],[0.35,100.48],[7.83,102.08],[104.12,102.08],[114.45,91.75],[114.45,31.38],[114.45,-0.88]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.133,-0.038],[0,0],[0,0],[0,0],[0,-1.46],[0,0],[1.133,-0.038],[0,0],[0,0],[0,0],[0,-1.46],[0,0]],"o":[[0,0],[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46],[0,0],[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46]],"v":[[115.165,-15.899],[114.482,-15.883],[114.517,-0.46],[115.165,-0.477],[117.209,2.203],[117.209,29.104],[115.165,31.783],[114.399,31.826],[114.42,-35.723],[115.165,-35.719],[117.209,-33.039],[117.209,-18.579]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[116.74,102.33],"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":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":0,"k":[99,99,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".black","cl":"black","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":[[15.291,0],[0,0],[0,15.652],[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0],[15.185,0],[0,0],[0,15.544]],"v":[[178.179,150],[-178.179,150],[-206,121.522],[-206,-121.522],[-178.179,-150],[178.286,-150],[206,-121.522],[206,121.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":332,"st":40,"ct":1,"bm":0}],"markers":[{"tm":240,"cm":"1","dr":0}],"props":{}}
\ No newline at end of file
diff --git a/res/raw/fold_setting_stay_awake_on_fold_lottie.json b/res/raw/fold_setting_stay_awake_on_fold_lottie.json
index 53b2ff0..3611a87 100644
--- a/res/raw/fold_setting_stay_awake_on_fold_lottie.json
+++ b/res/raw/fold_setting_stay_awake_on_fold_lottie.json
@@ -1 +1 @@
-{"v":"5.9.0","fr":60,"ip":0,"op":332,"w":412,"h":300,"nm":"Foldable_FoldingSetting_EDU_01_412x300","ddd":0,"assets":[{"id":"comp_0","nm":"Folded Youtube UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle 3470505","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[195.532,168,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[29,6],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470505","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle 3470502","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.032,148.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[96,9],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470502","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"▽ Group 24","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.647,94.93,0],"ix":2,"l":2},"a":{"a":0,"k":[19,5.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":38,"h":11,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Vector 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[194.532,63,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":[[-3.87,0],[0,-4.431],[0,0],[-2.777,0],[-1.047,-0.656]],"o":[[4.917,0],[0,0],[0.956,-2.133],[1.411,0],[1.184,-3.118]],"v":[[4.621,-4],[13.5,4],[-13.5,3.959],[-7.444,0.267],[-3.711,1.333]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"▽ Group 23","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.627,73.222,0],"ix":2,"l":2},"a":{"a":0,"k":[23,6,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":46,"h":12,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"▽ Group 21","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[222.901,108.93,0],"ix":2,"l":2},"a":{"a":0,"k":[9.5,11.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":19,"h":23,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"▽ Group 18","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.405,106.27,0],"ix":2,"l":2},"a":{"a":0,"k":[9.5,14,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":19,"h":28,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Rectangle 3470504","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.032,89.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[96,69],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,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":"Rectangle 3470504","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"▽ Group 17","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[163.262,132.883,0],"ix":2,"l":2},"a":{"a":0,"k":[2,4,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":4,"h":8,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Vector 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.282,133,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],[0,0]],"o":[[0,0],[0,0]],"v":[[36.25,0],[-36.25,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.933333337307,0.403921574354,0.360784322023,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Vector 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[233.032,133,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],[0,0]],"o":[[0,0],[0,0]],"v":[[22,0],[-22,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Ellipse 7581","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[168.032,164,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":[{"d":1,"ty":"el","s":{"a":0,"k":[14,14],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7581","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470507","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.032,210.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[96,69],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470507","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_1","nm":"▽ Group 24","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.069,5.305,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":[[-3.951,0],[0,-5.239],[0.044,-0.4],[0,0],[-2.087,0],[-0.755,-0.355],[-3.241,0],[-1.376,-1.465]],"o":[[5.194,0],[0,0.4],[0,0],[0.932,-1.687],[0.844,0],[1.154,-2.886],[2.175,0],[1.465,-3.374]],"v":[[9.656,-5.305],[19.069,4.107],[19.024,5.305],[-19.069,5.305],[-14.229,2.464],[-11.832,2.997],[-4.64,-1.887],[0.91,0.466]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_2","nm":"▽ Group 23","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22.865,6.238,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":[[-1.376,-5.239],[-1.288,0],[-0.71,-2.619],[0,0],[-3.774,0],[-1.421,-0.977],[-5.372,0]],"o":[[0.977,-0.71],[2.841,0],[0,0],[1.199,-3.374],[1.82,0],[1.598,-4.795],[5.638,0]],"v":[[13.408,2.864],[16.915,1.798],[22.865,6.238],[-22.865,6.238],[-14.696,0.466],[-9.723,2.064],[1.731,-6.238]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_3","nm":"▽ Group 21","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 22","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.264,11.313,0],"ix":2,"l":2},"a":{"a":0,"k":[9.5,11.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":19,"h":23,"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_4","nm":"▽ Group 22","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.264,11.313,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-9.264,11.313],[9.264,11.313],[3.421,1.621],[7.839,1.621],[0,-11.313],[-7.839,1.621],[-3.421,1.621]],"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,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.017,10.6],[-7.981,10.6],[-2.102,0.909],[-6.52,0.909],[0.036,-9.959],[6.592,0.909],[2.173,0.909]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_5","nm":"▽ Group 18","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 20","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.264,11.313,0],"ix":2,"l":2},"a":{"a":0,"k":[9.5,11.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":19,"h":23,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"▽ Group 19","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.265,25.197,0],"ix":2,"l":2},"a":{"a":0,"k":[3,3,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":6,"h":6,"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_6","nm":"▽ Group 20","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.264,11.313,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-9.264,11.313],[9.264,11.313],[3.421,1.621],[7.839,1.621],[0,-11.313],[-7.839,1.621],[-3.421,1.621]],"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,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.017,10.6],[-7.981,10.6],[-2.102,0.909],[-6.52,0.909],[0.036,-9.959],[6.592,0.909],[2.173,0.909]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_7","nm":"▽ Group 19","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2.957,2.779,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.957,2.779],[2.957,2.779],[2.957,-2.779],[2.245,-2.779],[2.245,2.067],[-2.245,2.067],[-2.245,-2.779],[-2.957,-2.779]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_8","nm":"▽ Group 17","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.46,3.883,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],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.883],[0,-3.883]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,3.883,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],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.883],[0,-3.883]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_9","nm":"Unfolded YouTube UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 9","refId":"comp_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[156.94,145.03,0],"ix":2,"l":2},"a":{"a":0,"k":[43,12,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":86,"h":24,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[176.64,71.83,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":[[-8.5,0],[0,-10.8],[0,0],[-6.1,0],[-2.3,-1.6]],"o":[[10.8,0],[0,0],[2.1,-5.2],[3.1,0],[2.6,-7.6]],"v":[[10.15,-9.75],[29.65,9.75],[-29.65,9.65],[-16.35,0.65],[-8.15,3.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"▽ Group 8","refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[251.49,96.13,0],"ix":2,"l":2},"a":{"a":0,"k":[51.5,14,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":103,"h":28,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"▽ Group 7","refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.22,226.963,0],"ix":2,"l":2},"a":{"a":0,"k":[2,4,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":4,"h":8,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Vector 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[166.369,227.275,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],[0,0]],"o":[[0,0],[0,0]],"v":[[44,0],[-44,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.933333337307,0.403921574354,0.360784322023,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Vector 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256.869,227.275,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],[0,0]],"o":[[0,0],[0,0]],"v":[[46.5,0],[-46.5,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"▽ Group 5","refId":"comp_13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.856,176.561,0],"ix":2,"l":2},"a":{"a":0,"k":[21,25.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":51,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"▽ Group 2","refId":"comp_15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[282.536,170.581,0],"ix":2,"l":2},"a":{"a":0,"k":[21,31.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":63,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Rectangle 3470504","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204.99,132.58,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[216,155],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,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":"Rectangle 3470504","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_10","nm":"▽ Group 9","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.95,11.95,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":[[-8.9,0],[0,-11.8],[0.1,-0.9],[0,0],[-4.7,0],[-1.7,-0.8],[-7.3,0],[-3.1,-3.3]],"o":[[11.7,0],[0,0.9],[0,0],[2.1,-3.8],[1.9,0],[2.6,-6.5],[4.9,0],[3.3,-7.6]],"v":[[21.75,-11.95],[42.95,9.25],[42.85,11.95],[-42.95,11.95],[-32.05,5.55],[-26.65,6.75],[-10.45,-4.25],[2.05,1.05]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_11","nm":"▽ Group 8","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[51.5,14.05,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":[[-3.1,-11.8],[-2.9,0],[-1.6,-5.9],[0,0],[-8.5,0],[-3.2,-2.2],[-12.1,0]],"o":[[2.2,-1.6],[6.4,0],[0,0],[2.7,-7.6],[4.1,0],[3.6,-10.8],[12.7,0]],"v":[[30.2,6.45],[38.1,4.05],[51.5,14.05],[-51.5,14.05],[-33.1,1.05],[-21.9,4.65],[3.9,-14.05]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_12","nm":"▽ Group 7","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.46,3.883,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],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.883],[0,-3.883]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,3.883,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],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.883],[0,-3.883]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_13","nm":"▽ Group 5","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 6","refId":"comp_14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,0],"ix":2,"l":2},"a":{"a":0,"k":[21,25.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":51,"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_14","nm":"▽ Group 6","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-20.866,25.481],[20.866,25.481],[7.704,3.652],[17.656,3.652],[0,-25.481],[-17.656,3.652],[-7.704,3.652]],"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,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.057,23.876],[-17.977,23.876],[-4.735,2.046],[-14.687,2.046],[0.08,-22.431],[14.847,2.046],[4.896,2.046]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_15","nm":"▽ Group 2","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"▽ Group 4","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,0],"ix":2,"l":2},"a":{"a":0,"k":[21,25.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":42,"h":51,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"▽ Group 3","refId":"comp_17","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.863,56.741,0],"ix":2,"l":2},"a":{"a":0,"k":[6.5,6.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":13,"h":13,"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_16","nm":"▽ Group 4","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.866,25.481,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-20.866,25.481],[20.866,25.481],[7.704,3.652],[17.656,3.652],[0,-25.481],[-17.656,3.652],[-7.704,3.652]],"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,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.057,23.876],[-17.977,23.876],[-4.735,2.046],[-14.687,2.046],[0.08,-22.431],[14.847,2.046],[4.896,2.046]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_17","nm":"▽ Group 3","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6.661,6.26,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],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.661,6.26],[6.661,6.26],[6.661,-6.26],[5.056,-6.26],[5.056,4.655],[-5.056,4.655],[-5.056,-6.26],[-6.661,-6.26]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_18","nm":"Folded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Ellipse 7590","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[86,6,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7590","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Ellipse 7594","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,160,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7594","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Ellipse 7593","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,128,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7593","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Ellipse 7592","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,96,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7592","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Ellipse 7591","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,64,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7591","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Ellipse 7589","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,32,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7589","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Rectangle 3470513","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,162.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470513","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Rectangle 3470511","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,130.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470511","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Rectangle 3470509","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,98.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470509","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Rectangle 3470507","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,66.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470507","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Rectangle 3470505","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,34.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470505","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Rectangle 3470512","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,156,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470512","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470510","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,124,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470510","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470508","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,92,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470508","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470506","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,60,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470506","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470504","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,28,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470504","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470503","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[37,6.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[74,13],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470503","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]},{"id":"comp_19","nm":"Unfolded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle 3470520","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,141.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470520","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle 3470519","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,132.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470519","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Rectangle 3470518","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,123.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470518","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Rectangle 3470517","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,114.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470517","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Rectangle 3470516","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,105.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470516","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Rectangle 3470515","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,96.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470515","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ellipse 7584","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296.494,74.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7584","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ellipse 7598","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,209.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7598","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Ellipse 7597","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,182.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7597","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Ellipse 7596","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,155.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7596","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Ellipse 7595","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,128.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7595","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Ellipse 7579","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,101.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7579","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470514","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[212.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470514","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470502","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[32,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470502","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470530","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,210.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470530","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470528","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,183.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470528","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470526","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,156.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470526","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Rectangle 3470524","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,129.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470524","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Rectangle 3470522","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,102.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470522","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Rectangle 3470529","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,204.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470529","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Rectangle 3470527","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,177.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470527","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Rectangle 3470525","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,150.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470525","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Rectangle 3470523","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,123.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470523","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Rectangle 3470521","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,96.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470521","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 4","sr":1,"ks":{"o":{"a":0,"k":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":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[88,88,100],"ix":6,"l":2}},"ao":0,"ip":181,"op":781,"st":181,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":191,"s":[0,0,0],"to":[-10.833,0,0],"ti":[10.833,0,0]},{"t":231,"s":[-65,0,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,"ip":181,"op":395,"st":191,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey603","cl":"grey603","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":211,"s":[0,100,100]},{"t":231,"s":[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.833,"y":1},"o":{"x":0.001,"y":0},"t":211,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.839],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.495,137.576],[54.264,146.808],[-54.501,114.37],[-59.648,109.223],[-59.708,-109.282],[-54.56,-114.429],[54.282,-146.679],[63.915,-137.047]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":212,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.838],[0,0],[-2.838,0],[0,0],[0,-9.436]],"o":[[0,8.464],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.623,136.911],[54.466,146.518],[-54.319,117.62],[-59.648,109.223],[-59.708,-109.282],[-54.594,-117.179],[54.309,-145.697],[63.951,-135.939]],"c":true}]},{"t":231,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.838],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.599,105.138],[54.368,114.37],[-54.501,114.37],[-59.648,109.223],[-59.708,-109.282],[-54.56,-114.429],[54.31,-114.429],[63.943,-104.797]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":211,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":212,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":231,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":212,"op":396,"st":190,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".black 6","cl":"black","parent":2,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":211,"s":[0,100,100]},{"t":231,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":211,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":212,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":231,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":212,"op":396,"st":190,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Folded Youtube UI","parent":2,"tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":231,"s":[0]},{"t":241,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[65,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":202,"op":802,"st":202,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".black 5","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":211,"s":[0,100,100]},{"t":231,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":211,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":212,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":231,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":212,"op":396,"st":190,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":199,"s":[206,150,0],"to":[1.444,0,0],"ti":[-2,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":200,"s":[214.667,150,0],"to":[2,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":201,"s":[218,150,0],"to":[1.083,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":202,"s":[221.167,150,0],"to":[1.083,0,0],"ti":[-1.111,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":203,"s":[224.5,150,0],"to":[1.111,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":204,"s":[227.833,150,0],"to":[1.333,0,0],"ti":[-1.528,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":205,"s":[232.5,150,0],"to":[1.528,0,0],"ti":[-1.583,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":206,"s":[237,150,0],"to":[1.583,0,0],"ti":[-1.889,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":207,"s":[242,150,0],"to":[1.889,0,0],"ti":[-2.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":208,"s":[248.333,150,0],"to":[2.167,0,0],"ti":[-2.278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":209,"s":[255,150,0],"to":[2.278,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[262,150,0],"to":[2.5,0,0],"ti":[-3.556,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":211,"s":[270,150,0],"to":[3.556,0,0],"ti":[-2.222,0,0]},{"t":212,"s":[283.333,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[311.96,210.22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":[43.52,5.61],"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":151,"op":781,"st":181,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Unfolded YouTube UI","parent":2,"tt":1,"refId":"comp_9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":201,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":151,"op":751,"st":151,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".grey602","cl":"grey602","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":191,"s":[100,100,100]},{"t":212,"s":[0,100,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":191,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-2.282,113.897],[-17.976,113.897],[-121.273,113.897],[-130.36,105.242],[-130.36,-104.809],[-121.273,-113.897],[-1.197,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-8.034,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.243],[118.937,113.897],[20.423,113.897],[-1.182,113.897],[-16.193,117.028],[-121.36,141.834],[-130.185,134.804],[-130.289,-134.192],[-121.277,-142.03],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"t":212,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-1.125,113.897],[-16.101,117.189],[-121.089,144.98],[-130.176,136.326],[-130.286,-135.704],[-121.198,-144.793],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":191,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":207,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":211,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":212,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":151,"op":212,"st":191,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".black 4","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":191,"s":[99,99,100]},{"t":212,"s":[-1,99,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":191,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":207,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":211,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":212,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":151,"op":212,"st":191,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".grey604","cl":"grey604","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[116.74,102.33,0],"ix":1,"l":2},"s":{"a":0,"k":[114.5,114.5,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.717,-109.174],[-119.283,-109.174],[-119.283,299.701],[115.717,299.701]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.17,0],[0,0],[0,4.18],[0,0],[-4.17,0],[0,0],[0,-4.18]],"o":[[0,4.18],[0,0],[-4.18,0],[0,0],[0,-4.18],[0,0],[4.18,0],[0,0]],"v":[[112.07,92.13],[104.12,99.71],[-106.16,99.71],[-114.11,92.13],[-114.11,-91.75],[-106.16,-99.71],[104.12,-99.71],[112.07,-91.75]],"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,0],[0.055,2.749],[0,0],[5.7,0],[0,0],[1.89,-1.05],[0.88,0.35],[0,0],[2.17,0],[0,0],[0,-5.7],[0,0],[-5.7,0],[0,0],[-1.89,1.05],[-0.85,-0.29],[0,0],[-2.17,0],[0,0],[0,5.7],[0,0],[0.055,2.493]],"o":[[0,0],[0,0],[0,-5.71],[0,0],[-2.17,0],[-0.88,0.35],[0,0],[-1.89,-1.06],[0,0],[-5.71,0],[0,0],[0,5.71],[0,0],[2.17,0],[0.83,-0.33],[0,0],[1.89,1.05],[0,0],[5.71,0],[0,0],[-0.069,-5.452],[0,0]],"v":[[114.45,-15.54],[114.45,-36.12],[114.45,-91.75],[104.12,-102.08],[6.42,-102.08],[0.23,-100.48],[-2.52,-100.47],[-2.55,-100.47],[-8.74,-102.08],[-106.16,-102.08],[-116.49,-91.75],[-116.49,91.75],[-106.16,102.08],[-8.54,102.08],[-2.35,100.48],[0.25,100.42],[0.35,100.48],[7.83,102.08],[104.12,102.08],[114.45,91.75],[114.45,31.38],[114.45,-0.88]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[116.74,102.33],"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":151,"op":419,"st":181,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".black 3","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":0,"k":[99,99,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":151,"op":395,"st":191,"bm":0},{"ddd":0,"ind":15,"ty":3,"nm":"Null 4","sr":1,"ks":{"o":{"a":0,"k":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":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[88,88,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":151,"st":30,"bm":0},{"ddd":0,"ind":16,"ty":3,"nm":"Null 1","parent":15,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[0,0,0],"to":[-10.833,0,0],"ti":[10.833,0,0]},{"t":80,"s":[-65,0,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,"ip":0,"op":151,"st":40,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":".grey600","cl":"grey600","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[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.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.839],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.495,137.576],[54.264,146.808],[-54.501,114.37],[-59.648,109.223],[-59.708,-109.282],[-54.56,-114.429],[54.282,-146.679],[63.915,-137.047]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.838],[0,0],[-2.838,0],[0,0],[0,-9.436]],"o":[[0,8.464],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.623,136.911],[54.466,146.518],[-54.319,117.62],[-59.648,109.223],[-59.708,-109.282],[-54.594,-117.179],[54.309,-145.697],[63.951,-135.939]],"c":true}]},{"t":80,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,2.838],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[0,-2.838],[0,0],[5.089,0],[0,0]],"v":[[63.599,105.138],[54.368,114.37],[-54.501,114.37],[-59.648,109.223],[-59.708,-109.282],[-54.56,-114.429],[54.31,-114.429],[63.943,-104.797]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"op":151,"st":39,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":".black 2","cl":"black","parent":16,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":151,"st":39,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"Folded Gmail UI","parent":16,"tt":1,"refId":"comp_18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"t":90,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[67.273,-5.682,0],"ix":2,"l":2},"a":{"a":0,"k":[46,83,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":92,"h":166,"ip":51,"op":151,"st":51,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":".black","cl":"black","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":151,"st":39,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[206,150,0],"to":[1.444,0,0],"ti":[-2,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[214.667,150,0],"to":[2,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[218,150,0],"to":[1.083,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[221.167,150,0],"to":[1.083,0,0],"ti":[-1.111,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[224.5,150,0],"to":[1.111,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[227.833,150,0],"to":[1.333,0,0],"ti":[-1.528,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[232.5,150,0],"to":[1.528,0,0],"ti":[-1.583,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[237,150,0],"to":[1.583,0,0],"ti":[-1.889,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[242,150,0],"to":[1.889,0,0],"ti":[-2.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[248.333,150,0],"to":[2.167,0,0],"ti":[-2.278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[255,150,0],"to":[2.278,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[262,150,0],"to":[2.5,0,0],"ti":[-3.556,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[270,150,0],"to":[3.556,0,0],"ti":[-2.222,0,0]},{"t":61,"s":[283.333,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[311.96,210.22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":[43.52,5.61],"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":0,"op":151,"st":30,"bm":0},{"ddd":0,"ind":22,"ty":0,"nm":"Unfolded Gmail UI","parent":16,"tt":1,"refId":"comp_19","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":50,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":".grey600","cl":"grey600","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"t":61,"s":[0,100,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-2.282,113.897],[-17.976,113.897],[-121.273,113.897],[-130.36,105.242],[-130.36,-104.809],[-121.273,-113.897],[-1.197,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-8.034,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.243],[118.937,113.897],[20.423,113.897],[-1.182,113.897],[-16.193,117.028],[-121.36,141.834],[-130.185,134.804],[-130.289,-134.192],[-121.277,-142.03],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"t":61,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-1.125,113.897],[-16.101,117.189],[-121.089,144.98],[-130.176,136.326],[-130.286,-135.704],[-121.198,-144.793],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"st":40,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":".black","cl":"black","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[99,99,100]},{"t":61,"s":[-1,99,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":40,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":".grey600","cl":"grey600","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[116.74,102.33,0],"ix":1,"l":2},"s":{"a":0,"k":[114.5,114.5,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.717,-109.174],[-119.283,-109.174],[-119.283,299.701],[115.717,299.701]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.17,0],[0,0],[0,4.18],[0,0],[-4.17,0],[0,0],[0,-4.18]],"o":[[0,4.18],[0,0],[-4.18,0],[0,0],[0,-4.18],[0,0],[4.18,0],[0,0]],"v":[[112.07,92.13],[104.12,99.71],[-106.16,99.71],[-114.11,92.13],[-114.11,-91.75],[-106.16,-99.71],[104.12,-99.71],[112.07,-91.75]],"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,0],[0.055,2.749],[0,0],[5.7,0],[0,0],[1.89,-1.05],[0.88,0.35],[0,0],[2.17,0],[0,0],[0,-5.7],[0,0],[-5.7,0],[0,0],[-1.89,1.05],[-0.85,-0.29],[0,0],[-2.17,0],[0,0],[0,5.7],[0,0],[0.055,2.493]],"o":[[0,0],[0,0],[0,-5.71],[0,0],[-2.17,0],[-0.88,0.35],[0,0],[-1.89,-1.06],[0,0],[-5.71,0],[0,0],[0,5.71],[0,0],[2.17,0],[0.83,-0.33],[0,0],[1.89,1.05],[0,0],[5.71,0],[0,0],[-0.069,-5.452],[0,0]],"v":[[114.45,-15.54],[114.45,-36.12],[114.45,-91.75],[104.12,-102.08],[6.42,-102.08],[0.23,-100.48],[-2.52,-100.47],[-2.55,-100.47],[-8.74,-102.08],[-106.16,-102.08],[-116.49,-91.75],[-116.49,91.75],[-106.16,102.08],[-8.54,102.08],[-2.35,100.48],[0.25,100.42],[0.35,100.48],[7.83,102.08],[104.12,102.08],[114.45,91.75],[114.45,31.38],[114.45,-0.88]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[116.74,102.33],"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":30,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":".black","cl":"black","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":0,"k":[99,99,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":40,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":".black","cl":"black","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":[[15.291,0],[0,0],[0,15.652],[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0],[15.185,0],[0,0],[0,15.544]],"v":[[178.179,150],[-178.179,150],[-206,121.522],[-206,-121.522],[-178.179,-150],[178.286,-150],[206,-121.522],[206,121.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":332,"st":40,"bm":0}],"markers":[]}
\ No newline at end of file
+{"v":"5.12.1","fr":60,"ip":0,"op":241,"w":412,"h":300,"nm":"Foldable_FoldingSetting_EDU_01_412x300_export","ddd":0,"assets":[{"id":"comp_0","nm":"Folded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Ellipse 7590","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[86,6,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7590","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Ellipse 7594","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,160,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7594","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Ellipse 7593","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,128,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7593","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Ellipse 7592","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,96,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7592","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Ellipse 7591","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,64,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7591","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Ellipse 7589","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6,32,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":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7589","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Rectangle 3470513","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,162.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470513","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Rectangle 3470511","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,130.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470511","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Rectangle 3470509","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,98.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470509","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Rectangle 3470507","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,66.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470507","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Rectangle 3470505","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[40,34.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470505","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Rectangle 3470512","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,156,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470512","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470510","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,124,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470510","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470508","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,92,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470508","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470506","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,60,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470506","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470504","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,28,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470504","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470503","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[37,6.5,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[74,13],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470503","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Unfolded Gmail UI","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle 3470520","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,141.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470520","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle 3470519","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,132.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470519","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Rectangle 3470518","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,123.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470518","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Rectangle 3470517","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,114.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470517","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Rectangle 3470516","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,105.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470516","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Rectangle 3470515","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.994,96.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470515","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ellipse 7584","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296.494,74.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7584","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ellipse 7598","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,209.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7598","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Ellipse 7597","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,182.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7597","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Ellipse 7596","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,155.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7596","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Ellipse 7595","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,128.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7595","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Ellipse 7579","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.494,101.582,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":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Ellipse 7579","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Rectangle 3470514","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[212.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470514","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Rectangle 3470502","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.994,74.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[32,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470502","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rectangle 3470530","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,210.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470530","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rectangle 3470528","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,183.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470528","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Rectangle 3470526","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,156.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470526","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Rectangle 3470524","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,129.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470524","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Rectangle 3470522","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.994,102.582,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470522","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Rectangle 3470529","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,204.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470529","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Rectangle 3470527","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,177.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470527","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Rectangle 3470525","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,150.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470525","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Rectangle 3470523","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,123.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470523","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Rectangle 3470521","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.494,96.082,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[17,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.250980407,0.262745112181,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":"Rectangle 3470521","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 4","sr":1,"ks":{"o":{"a":0,"k":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":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[88,88,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":241,"st":30,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[0,0,0],"to":[-10.833,0,0],"ti":[10.833,0,0]},{"t":80,"s":[-65,0,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,"ip":0,"op":241,"st":40,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[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.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,0],[5.09,0],[0,0],[-2.838,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[-2.838,0],[0,0],[5.089,0],[0,0]],"v":[[63.495,137.576],[54.264,146.808],[-54.501,114.37],[-54.56,-114.429],[54.282,-146.679],[63.915,-137.047]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,0],[5.09,0],[0,0],[-2.838,0],[0,0],[0,-9.436]],"o":[[0,8.464],[0,0],[-2.838,0],[0,0],[5.089,0],[0,0]],"v":[[63.623,136.911],[54.466,146.518],[-54.319,117.62],[-54.594,-117.179],[54.309,-145.697],[63.951,-135.939]],"c":true}]},{"t":80,"s":[{"i":[[0,0],[5.09,0],[0,0],[0,0],[0,0],[0,-5.089]],"o":[[0,5.09],[0,0],[0,0],[0,0],[5.089,0],[0,0]],"v":[[63.599,105.138],[54.368,114.37],[-60.431,114.394],[-60.313,-114.39],[54.31,-114.429],[63.943,-104.797]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"op":241,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".black 2","cl":"black","parent":2,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":241,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Folded Gmail UI","parent":2,"tt":1,"tp":4,"refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[0]},{"t":90,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[67.273,-5.682,0],"ix":2,"l":2},"a":{"a":0,"k":[46,83,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":92,"h":166,"ip":51,"op":241,"st":51,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.971,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-68.471,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":80,"s":[99,99,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.001,"y":0},"t":60,"s":[{"i":[[0,1.789],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-1.339]],"v":[[66.136,-9.414],[66.108,-137.044],[54.305,-148.847],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.23,149.034],[66.032,137.232],[66.136,27.401]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,2.744],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,14.182],[0,0]],"o":[[0,0],[0,-14.188],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-2.275]],"v":[[76.36,-9.414],[76.369,-135.937],[54.341,-147.74],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.359,148.37],[76.385,136.568],[76.36,27.401]],"c":true}]},{"t":80,"s":[{"i":[[0,4.914],[0,0],[6.519,0],[0,0],[0,-2.523],[0,0],[-2.523,0],[0,0],[0,6.518],[0,0]],"o":[[0,0],[0,-6.519],[0,0],[-2.523,0],[0,0],[0,2.523],[0,0],[6.518,0],[0,0],[0,-4.401]],"v":[[66.136,-9.414],[66.136,-104.794],[54.333,-116.597],[-63.903,-116.597],[-68.471,-112.028],[-68.471,112.028],[-63.903,116.597],[54.334,116.597],[66.136,104.795],[66.136,27.401]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":241,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[206,150,0],"to":[1.444,0,0],"ti":[-2,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[214.667,150,0],"to":[2,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[218,150,0],"to":[1.083,0,0],"ti":[-1.083,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[221.167,150,0],"to":[1.083,0,0],"ti":[-1.111,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[224.5,150,0],"to":[1.111,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[227.833,150,0],"to":[1.333,0,0],"ti":[-1.528,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[232.5,150,0],"to":[1.528,0,0],"ti":[-1.583,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[237,150,0],"to":[1.583,0,0],"ti":[-1.889,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[242,150,0],"to":[1.889,0,0],"ti":[-2.167,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[248.333,150,0],"to":[2.167,0,0],"ti":[-2.278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[255,150,0],"to":[2.278,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[262,150,0],"to":[2.5,0,0],"ti":[-3.556,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[270,150,0],"to":[3.556,0,0],"ti":[-2.222,0,0]},{"t":61,"s":[283.333,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[311.96,210.22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":[43.52,5.61],"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":0,"op":241,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Unfolded Gmail UI","parent":2,"tt":1,"tp":7,"refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":50,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[113.636,113.636,100],"ix":6,"l":2}},"ao":0,"w":412,"h":300,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"t":61,"s":[0,100,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-2.282,113.897],[-17.976,113.897],[-121.273,113.897],[-130.36,105.242],[-130.36,-104.809],[-121.273,-113.897],[-1.197,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-8.034,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.243],[118.937,113.897],[20.423,113.897],[-1.182,113.897],[-16.193,117.028],[-121.36,141.834],[-130.185,134.804],[-130.289,-134.192],[-121.277,-142.03],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]},{"t":61,"s":[{"i":[[0,0],[4.771,0],[0,0],[0,0],[0,0],[0,0],[0,4.772],[0,0],[-4.771,0],[0,0],[0,0],[0,-4.772]],"o":[[0,4.772],[0,0],[0,0],[0,0],[0,0],[-4.771,0],[0,0],[0,-4.772],[0,0],[0,0],[4.771,0],[0,0]],"v":[[128.025,105.242],[118.937,113.897],[20.423,113.897],[-1.125,113.897],[-16.101,117.189],[-121.089,144.98],[-130.176,136.326],[-130.286,-135.704],[-121.198,-144.793],[-1.188,-113.897],[118.937,-113.897],[128.025,-104.809]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,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":61,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":40,"s":[99,99,100]},{"t":61,"s":[-1,99,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.495,0.571],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.733,0.815],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.787,-0.915],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.2,-0.463],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-115.408],[-10,-118.046],[-124.313,-139.448],[-136.266,-129.393],[-136.179,129.543],[-124.572,138.847],[-9.85,117.863],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.498,0.671],[7.261,0],[0,-6.52],[0,0],[-17.913,0],[0,0],[0,0],[-2.833,0.748],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.896,-0.865],[0,0],[-23.138,0],[0,0],[0,6.52],[10.232,0],[0,0],[2.152,-0.545],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-12.716,-117.624],[-123.042,-143.651],[-144.273,-133.721],[-144.17,133.897],[-128.267,144.577],[-10.465,117.238],[-8.936,116.926],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"i":{"x":0.8,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.499,0.698],[0,0],[0,-12.135],[0,0],[-34.442,0],[0,0],[0,0],[-2.859,0.73],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.925,-0.851],[0,0],[-32.058,0],[0,0],[0,11.078],[0,0],[0,0],[2.14,-0.566],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.836],[-126.224,-145.794],[-160.39,-134.865],[-160.283,135.047],[-126.011,146.227],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.938,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]},{"t":61,"s":[{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.5,0.717],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.879,0.717],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.946,-0.842],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.13,-0.582],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.842],[-121.197,-147.509],[-133.002,-135.704],[-132.892,135.892],[-121.088,147.697],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".grey600","cl":"grey600","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[116.74,102.33,0],"ix":1,"l":2},"s":{"a":0,"k":[114.5,114.5,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[115.717,-109.174],[-119.283,-109.174],[-119.283,299.701],[115.717,299.701]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.17,0],[0,0],[0,4.18],[0,0],[-4.17,0],[0,0],[0,-4.18]],"o":[[0,4.18],[0,0],[-4.18,0],[0,0],[0,-4.18],[0,0],[4.18,0],[0,0]],"v":[[112.07,92.13],[104.12,99.71],[-106.16,99.71],[-114.11,92.13],[-114.11,-91.75],[-106.16,-99.71],[104.12,-99.71],[112.07,-91.75]],"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,0],[0.055,2.749],[0,0],[5.7,0],[0,0],[1.89,-1.05],[0.88,0.35],[0,0],[2.17,0],[0,0],[0,-5.7],[0,0],[-5.7,0],[0,0],[-1.89,1.05],[-0.85,-0.29],[0,0],[-2.17,0],[0,0],[0,5.7],[0,0],[0.055,2.493]],"o":[[0,0],[0,0],[0,-5.71],[0,0],[-2.17,0],[-0.88,0.35],[0,0],[-1.89,-1.06],[0,0],[-5.71,0],[0,0],[0,5.71],[0,0],[2.17,0],[0.83,-0.33],[0,0],[1.89,1.05],[0,0],[5.71,0],[0,0],[-0.069,-5.452],[0,0]],"v":[[114.45,-15.54],[114.45,-36.12],[114.45,-91.75],[104.12,-102.08],[6.42,-102.08],[0.23,-100.48],[-2.52,-100.47],[-2.55,-100.47],[-8.74,-102.08],[-106.16,-102.08],[-116.49,-91.75],[-116.49,91.75],[-106.16,102.08],[-8.54,102.08],[-2.35,100.48],[0.25,100.42],[0.35,100.48],[7.83,102.08],[104.12,102.08],[114.45,91.75],[114.45,31.38],[114.45,-0.88]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.133,-0.038],[0,0],[0,0],[0,0],[0,-1.46],[0,0],[1.133,-0.038],[0,0],[0,0],[0,0],[0,-1.46],[0,0]],"o":[[0,0],[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46],[0,0],[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46]],"v":[[115.165,-15.899],[114.482,-15.883],[114.517,-0.46],[115.165,-0.477],[117.209,2.203],[117.209,29.104],[115.165,31.783],[114.399,31.826],[114.42,-35.723],[115.165,-35.719],[117.209,-33.039],[117.209,-18.579]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[116.74,102.33],"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":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".black","cl":"black","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,0,0],"ix":1,"l":2},"s":{"a":0,"k":[99,99,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":true,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2,-197],[-237,-197],[-237,211.874],[-2,211.874]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.295,0.044],[0,0],[6.52,0],[0,0],[2.164,-1.2],[1.012,0.395],[0,0],[2.474,0],[0,0],[0,-6.52],[0,0],[-6.52,0],[0,0],[0,0],[-2.164,1.2],[-0.966,-0.33],[0,0],[-2.474,0],[0,0],[0,0],[0,6.519],[0,0],[0,1.668],[0,0]],"o":[[0,0],[0,-6.52],[0,0],[-2.474,0],[-1.008,0.404],[0,0],[-2.164,-1.2],[0,0],[-6.52,0],[0,0],[0,6.52],[0,0],[0,0],[2.474,0],[0.951,-0.381],[0,0],[2.163,1.2],[0,0],[0,0],[6.519,0],[0,0],[1.295,-0.044],[0,0],[0,-1.668]],"v":[[130.741,-9.416],[130.741,-104.809],[118.936,-116.613],[7.323,-116.613],[0.252,-114.783],[-2.892,-114.769],[-2.929,-114.783],[-10,-116.613],[-121.272,-116.613],[-133.077,-104.809],[-133.077,104.809],[-121.272,116.613],[-9.85,116.613],[-9.755,116.613],[-2.684,114.783],[0.286,114.719],[0.401,114.783],[8.942,116.613],[9.038,116.613],[118.937,116.613],[130.741,104.81],[130.741,27.405],[133.077,24.344],[133.077,-6.354]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".black","cl":"black","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":[[15.291,0],[0,0],[0,15.652],[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[-15.291,0],[0,0],[0,-15.652],[0,0],[15.185,0],[0,0],[0,15.544]],"v":[[178.179,150],[-178.179,150],[-206,121.522],[-206,-121.522],[-178.179,-150],[178.286,-150],[206,-121.522],[206,121.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":332,"st":40,"ct":1,"bm":0}],"markers":[{"tm":240,"cm":"1","dr":0}],"props":{}}
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b760f68..caf3e7f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1219,15 +1219,15 @@
<string name="work_profile_category_header">Work profile</string>
<!-- Title for the Private Space page. [CHAR LIMIT=60] -->
- <string name="private_space_title">Private Space</string>
+ <string name="private_space_title">Private space</string>
<!-- Summary for the Private Space page. [CHAR LIMIT=NONE] -->
<string name="private_space_summary">Keep private apps locked and hidden</string>
<!-- Description for the Private Space page. [CHAR LIMIT=NONE] -->
<string name="private_space_description">Keep private apps in a separate space that you can hide or lock</string>
<!-- Title for the Private Space one lock preference. [CHAR LIMIT=60] -->
- <string name="private_space_lock_title">Private Space lock</string>
+ <string name="private_space_lock_title">Private space lock</string>
<!-- Description for the Private Space one lock preference page. [CHAR LIMIT=NONE] -->
- <string name="private_space_one_lock_summary">You can unlock Private Space the same way you unlock your device, or choose a different lock</string>
+ <string name="private_space_one_lock_summary">You can unlock your private space the same way you unlock your device, or choose a different lock</string>
<!-- Title for the Private Space one lock preference. [CHAR LIMIT=60] -->
<string name="private_space_screen_lock_title">Use device screen lock</string>
<!-- Title for the Face and Fingerprint preference. [CHAR LIMIT=60] -->
@@ -1239,15 +1239,15 @@
<!-- Summary for the Face and Fingerprint preference when no biometric is set. [CHAR LIMIT=60] -->
<string name="private_space_biometric_summary">Tap to set up</string>
<!-- Title for the Fingerprint unlock for private space preference. [CHAR LIMIT=60] -->
- <string name="private_space_fingerprint_unlock_title">Fingerprint Unlock for Private Space</string>
+ <string name="private_space_fingerprint_unlock_title">Fingerprint Unlock for private space</string>
<!-- Title for the Face unlock for private space preference. [CHAR LIMIT=60] -->
- <string name="private_space_face_unlock_title">Face Unlock for Private Space</string>
+ <string name="private_space_face_unlock_title">Face Unlock for private space</string>
<!-- Biometric category title - biometric options for unlocking the device. [CHAR LIMIT=50] -->
<string name="private_space_category_ways_to_unlock">Ways to unlock</string>
<!-- Summary for one lock when device screen lock is used as private profile lock. [CHAR LIMIT=40] -->
<string name="private_space_screen_lock_summary">Same as device screen lock</string>
<!-- Dialog message to choose a new lock for Private Space. [CHAR LIMIT=50] -->
- <string name="private_space_new_lock_title">Choose a new lock for Private Space?</string>
+ <string name="private_space_new_lock_title">Choose a new lock for private space?</string>
<!-- Title for the preference for auto lock private space. [CHAR LIMIT=40] -->
<string name="private_space_auto_lock_title">Lock automatically</string>
<!-- Title for private space auto lock settings page. [CHAR LIMIT=50] -->
@@ -1263,29 +1263,41 @@
<!-- Title for the preference to hide Private Space. [CHAR LIMIT=60] -->
<string name="private_space_hide_title">Hide when locked</string>
<!-- Title for the hide Private Space setting. [CHAR LIMIT=60] -->
- <string name="privatespace_hide_page_title">Hide Private Space when locked</string>
+ <string name="privatespace_hide_page_title">Hide private space when locked</string>
<!-- Description for hide Private Space settings page. [CHAR LIMIT=NONE] -->
- <string name="privatespace_hide_page_summary">To stop other people knowing Private Space is on your device, you can hide it from your apps list</string>
+ <string name="privatespace_hide_page_summary">To stop other people knowing you have a private space on your device, you can hide it from your apps list</string>
<!-- Header in hide Private Space settings page to access Private Space when hidden. [CHAR LIMIT=60] -->
- <string name="privatespace_access_header">Access Private Space when hidden</string>
+ <string name="privatespace_access_header">Access private space when hidden</string>
<!-- Text in hide Private Space settings page on how to search Private Space when hidden. [CHAR LIMIT=60] -->
- <string name="privatespace_search_description">Search for \'Private Space\' in the search bar</string>
+ <string name="privatespace_search_description">From your apps list, enter \'private space\' in the search bar</string>
<!-- Text in hide Private Space settings page to tap on Private Space tile. [CHAR LIMIT=60] -->
- <string name="privatespace_tap_tile_description">Tap the Private Space tile</string>
+ <string name="privatespace_tap_tile_description">Tap the private space tile</string>
<!-- Text in hide Private Space settings page to Unlock Private Space. [CHAR LIMIT=60] -->
- <string name="privatespace_unlock_description">Unlock your Private Space</string>
+ <string name="privatespace_unlock_description">Unlock your private space</string>
<!-- Used to describe the off state of Private space hidden [CHAR LIMIT=30] -->
<string name="privatespace_hide_off_summary">Off</string>
<!-- Used to describe the off state of Private space hidden [CHAR LIMIT=30] -->
<string name="privatespace_hide_on_summary">On</string>
<!-- System category for the Private Space page. [CHAR LIMIT=30] -->
<string name="private_space_category_system">System</string>
- <!-- Title for the preference to delete Private Space. [CHAR LIMIT=60] -->
- <string name="private_space_delete_title">Delete Private Space</string>
+ <!-- Title for the preference to delete Private Space. [CHAR LIMIT=40] -->
+ <string name="private_space_delete_title">Delete private space</string>
+ <!-- Title for the delete private space page. [CHAR LIMIT=40] -->
+ <string name="private_space_delete_header">Delete private space?</string>
+ <!-- Description for hide Private Space settings page. [CHAR LIMIT=NONE] -->
+ <string name="private_space_delete_summary">Your private space will be removed from your device. All private apps and data will be deleted. You can’t undo this action.</string>
+ <!-- Text for the accounts added to private space that will be removed. [CHAR LIMIT=90] -->
+ <string name="private_space_accounts">The following accounts will be removed from your private space:</string>
+ <!-- Label for private space delete button [CHAR LIMIT=30] -->
+ <string name="private_space_delete_button_label">Delete</string>
+ <!-- Title for the private space delete confirmation page. [CHAR LIMIT=40] -->
+ <string name="private_space_confirm_deletion_header">Deleting private space\u2026</string>
+ <!-- Description for private space delete confirmation page that mentions it will take a few moments. [CHAR LIMIT=40] -->
+ <string name="private_space_confirm_deletion_summary">This will take a few moments</string>
<!-- Toast to show when the private space was deleted. [CHAR LIMIT=NONE] -->
- <string name="private_space_deleted">Private Space successfully deleted</string>
+ <string name="private_space_deleted">Private space deleted</string>
<!-- Toast to show when the private space could not be deleted. [CHAR LIMIT=NONE] -->
- <string name="private_space_delete_failed">Private Space could not be deleted</string>
+ <string name="private_space_delete_failed">Private space could not be deleted</string>
<!-- Toast to show when the private space is unlocked from settings entry point. [CHAR LIMIT=40] -->
<string name="private_space_unlocked">Private space unlocked</string>
<!-- Title of the Alert Dialog when no screen lock is set [CHAR LIMIT=30] -->
@@ -1317,13 +1329,13 @@
<!-- Text shown at the bottom in private space auto advancing screens. [CHAR LIMIT=60] -->
<string name="private_space_setting_up_text">Setting up private space\u2026</string>
<!-- Title for private space setup in auto advancing screen informing private space notifications are hidden when locked. [CHAR LIMIT=NONE] -->
- <string name="private_space_notifications_hidden_title">Notifications from apps in private space are hidden when it\u2019s locked</string>
+ <string name="private_space_notifications_hidden_title">Notifications from private space apps are hidden when it\u2019s locked</string>
<!-- Title for private space setup in auto advancing screen informing photos/files from private space can be shared when unlocked. [CHAR LIMIT=NONE] -->
- <string name="private_space_share_photos_title">Unlock private space to share photos or files from private space apps</string>
+ <string name="private_space_share_photos_title">Unlock private space to share photos or files</string>
<!-- Title for private space setup in auto advancing screen informing some system apps are already installed in private space. [CHAR LIMIT=NONE] -->
<string name="private_space_apps_installed_title">Some apps are already installed in your private space</string>
<!-- Title for private space creation error screen. [CHAR LIMIT=60] -->
- <string name="private_space_error_screen_title">Couldn\u2019t set up private space</string>
+ <string name="private_space_error_screen_title">Couldn\u2019t set up a private space</string>
<!-- Label for button to retry creating private space again on creation error. [CHAR LIMIT=30] -->
<string name="private_space_tryagain_label">Try Again</string>
<!-- Title for private space lock setup screen. [CHAR LIMIT=90] -->
@@ -1337,7 +1349,7 @@
<!-- Title for private space setup success screen. [CHAR LIMIT=30] -->
<string name="private_space_success_title">All set!</string>
<!-- Summary for the private space setup success screen. [CHAR LIMIT=NONE] -->
- <string name="private_space_access_text">To access your private space, go to your apps list then scroll down</string>
+ <string name="private_space_access_text">To find your private space, go to your apps list then scroll down</string>
<!-- Label for private space done button to show a toast, finish setup and launch All apps [CHAR LIMIT=30] -->
<string name="private_space_done_label">Done</string>
<!-- Toast to show on private space setup completion informing user to scroll down All apps to access private space. [CHAR LIMIT=60] -->
@@ -1363,13 +1375,13 @@
<!-- TODO(b/309950257): Remove below strings once QSTIle fulfillment is complete. -->
<!-- Header in hide Private Space settings page to unhide Private Space. [CHAR LIMIT=90] -->
- <string name="privatespace_unhide_header">To show Private Space (Not final UX)</string>
+ <string name="privatespace_unhide_header">To show private space (Not final UX)</string>
<!-- Text in hide Private Space settings page on how to open Private Space setting. [CHAR LIMIT=NONE] -->
<string name="privatespace_open_settings">Open the Settings App</string>
<!-- Text in hide Private Space settings page on how to open Private Space setting. [CHAR LIMIT=NONE] -->
- <string name="privatespace_tap_settings">Tap on Security & privacy > Private Space > Hide Private Space when locked</string>
+ <string name="privatespace_tap_settings">Tap on Security & privacy > private space > Hide private space when locked</string>
<!-- Text in hide Private Space settings page to off hide toggle. [CHAR LIMIT=90] -->
- <string name="privatespace_turnoff_hide">Turn off \‘Hide Private Space when locked\’ toggle</string>
+ <string name="privatespace_turnoff_hide">Turn off \‘Hide private space when locked\’ toggle</string>
<!-- Note in hide Private Space settings page to inform that this is a development feature. [CHAR LIMIT=NONE] -->
<string name="privatespace_development_note">Note to Googlers: The development of this feature is still in progress</string>
@@ -7253,7 +7265,7 @@
<!-- Summary text describing signal strength to the user. [CHAR LIMIT=60] -->
<string name="sim_signal_strength"><xliff:g id="dbm">%1$d</xliff:g> dBm <xliff:g id="asu">%2$d</xliff:g> asu</string>
<!-- Title for SIM notification. [CHAR LIMIT=40] -->
- <string name="sim_notification_title">SIMs changed.</string>
+ <string name="sim_notification_title">Your SIMs changed</string>
<!-- Message under title informing the user to touch to go to SIM Cards in Settings. [CHAR LIMIT=40] -->
<string name="sim_notification_summary">Tap to set up</string>
@@ -7306,7 +7318,7 @@
<!-- Title for setting tile leading to saved autofill passwords, autofill, and account settings [CHAR LIMIT=40]-->
<string name="account_dashboard_title">Passwords & accounts</string>
<!-- Summary for setting tile leading to saved autofill passwords, autofill, and account settings [CHAR LIMIT=NONE]-->
- <string name="account_dashboard_default_summary">Saved passwords, autofill, synced accounts</string>
+ <string name="account_dashboard_default_summary">Suggestions for sign-in & autofill</string>
<!-- Title for setting tile leading to setting UI which allows user set default app to
handle actions such as open web page, making phone calls, default SMS apps [CHAR LIMIT=40]-->
<string name="app_default_dashboard_title">Default apps</string>
@@ -9043,7 +9055,7 @@
<string name="screen_pinning_unlock_none">Lock device when unpinning</string>
<!-- [CHAR LIMIT=60] turn eSim deletion confirmation on/off -->
- <string name="confirm_sim_deletion_title">Confirm SIM deletion</string>
+ <string name="confirm_sim_deletion_title">Confirm you want to erase your eSIM</string>
<!-- [CHAR LIMIT=NONE] eSim deletion confirmation description -->
<string name="confirm_sim_deletion_description">Verify it\u0027s you before erasing an eSIM</string>
@@ -10773,8 +10785,8 @@
<string name="autofill_passwords">Passwords</string>
<!-- Preference category for showing autofill and credman services with saved credentials. [CHAR LIMIT=60] -->
<string name="credman_chosen_app_title">Preferred service</string>
- <!-- Preference category for showing additional credential providers. [CHAR LIMIT=60] -->
- <string name="credman_credentials">Additional providers</string>
+ <!-- Preference category for showing additional credential services. [CHAR LIMIT=60] -->
+ <string name="credman_credentials">Additional services</string>
<!-- Summary for passwords settings that shows how many passwords are saved for each autofill
service. [CHAR LIMIT=NONE] -->
<string name="autofill_passwords_count">{count, plural,
@@ -10819,7 +10831,7 @@
</string>
<!-- Title of the screen where the user picks a provider. [CHAR_LIMIT=NONE] -->
- <string name="credman_picker_title">Passwords, passkeys, and data services</string>
+ <string name="credman_picker_title">Preferred service for passwords, passkeys & autofill</string>
<!-- Title of the warning dialog for disabling the credential provider. [CHAR_LIMIT=NONE] -->
<string name="credman_confirmation_message_title">Turn off %1$s\?</string>
@@ -10836,6 +10848,9 @@
]]>
</string>
+ <!-- Title for setting tile leading to saved autofill passwords, passkeys, autofill, and account settings [CHAR LIMIT=40]-->
+ <string name="account_dashboard_title_with_passkeys">Passwords, passkeys & autofill</string>
+
<!-- Message of the warning dialog for disabling the credential provider (new strings for 24Q3). [CHAR_LIMIT=NONE] -->
<string name="credman_confirmation_message_new_ui">
<![CDATA[
@@ -11358,7 +11373,7 @@
the user that the way to disable this SIM is to physically remove it. This is in contrast
to eSIM's, which can disabled using an on/off toggle switch. [CHAR LIMIT=NONE] -->
<string name="mobile_network_disable_sim_explanation">
- To disable this SIM, remove the SIM card
+ To turn off this SIM, remove the SIM card
</string>
<!--Summary used when a physical SIM is disabled, indicating that tapping on the preference will
@@ -11366,7 +11381,7 @@
Network & internet page (if there are no other SIMs), or on the mobile network list page.
[CHAR LIMIT=50] -->
<string name="mobile_network_tap_to_activate">
- Tap to activate <xliff:g id="carrier" example="T-mobile">%1$s</xliff:g>
+ Tap to activate your <xliff:g id="carrier" example="T-mobile">%1$s</xliff:g> SIM
</string>
<!-- Mobile network details page. Label for an option that lets the user delete an eSIM from
@@ -11490,13 +11505,13 @@
<!-- Text of carrier list item in the mep confirmation dialog asking the user if they want to turn off the carrier. [CHAR_LIMIT=NONE] -->
<string name="sim_action_switch_sub_dialog_info_outline_for_turning_off">Turning off a SIM won\u2019t cancel your service</string>
<!-- Status message indicating the device is in the process of disconnecting from one mobile network and immediately connecting to another. [CHAR_LIMIT=NONE] -->
- <string name="sim_action_enabling_sim_without_carrier_name">Connecting to network…</string>
+ <string name="sim_action_enabling_sim_without_carrier_name">Activating your SIM…</string>
<!-- Text of progress dialog indicating the subscription switch is in progress. [CHAR_LIMIT=NONE] -->
- <string name="sim_action_switch_sub_dialog_progress">Switching to <xliff:g id="carrier_name" example="Google Fi">%1$s</xliff:g> for calls and messages…</string>
+ <string name="sim_action_switch_sub_dialog_progress">Switching to <xliff:g id="carrier_name" example="Google Fi">%1$s</xliff:g>…</string>
<!-- Title of error message indicating that the device could not disconnect from one mobile network and immediately connect to another. [CHAR_LIMIT=NONE] -->
- <string name="sim_action_enable_sim_fail_title">Can\u2019t switch carrier</string>
+ <string name="sim_action_enable_sim_fail_title">Can\u2019t switch SIMs</string>
<!-- Body text of error message indicating the device could not disconnect from one mobile network and immediately connect to another, due to an unspecified issue. [CHAR_LIMIT=NONE] -->
- <string name="sim_action_enable_sim_fail_text">The carrier can\u2019t be switched due to an error.</string>
+ <string name="sim_action_enable_sim_fail_text">Something went wrong. Can\u2019t switch SIMs.</string>
<!-- Title of confirmation dialog asking the user if they want to disable subscription. [CHAR_LIMIT=NONE] -->
<string name="privileged_action_disable_sub_dialog_title">Turn off <xliff:g id="carrier_name" example="Google Fi">%1$s</xliff:g>?</string>
<!-- Title of confirmation dialog asking the user if they want to disable subscription. [CHAR_LIMIT=NONE] -->
@@ -11504,9 +11519,9 @@
<!-- Disabling SIMs progress dialog message [CHAR LIMIT=NONE] -->
<string name="privileged_action_disable_sub_dialog_progress">Turning off SIM<xliff:g id="ellipsis" example="...">…</xliff:g></string>
<!-- Title of error messaging indicating the device could not disable the mobile network. [CHAR LIMIT=NONE] -->
- <string name="privileged_action_disable_fail_title">Can\u2019t disable carrier</string>
+ <string name="privileged_action_disable_fail_title">Can\u2019t turn off SIM</string>
<!-- Body text of error message indicating the device could not disable the mobile network, due to an unknown issue. [CHAR LIMIT=NONE] -->
- <string name="privileged_action_disable_fail_text">Something went wrong and your carrier could not be disabled.</string>
+ <string name="privileged_action_disable_fail_text">Something went wrong and your SIM could not be turned off.</string>
<!-- Title on a dialog asking the users whether they want to enable DSDS mode. [CHAR LIMIT=NONE] -->
<string name="sim_action_enable_dsds_title">Use 2 SIMs?</string>
<!-- Message in a dialog indicating the user can enable DSDS mode. [CHAR LIMIT=NONE] -->
@@ -11586,7 +11601,7 @@
<!-- Title on a push notification indicating that the user's device is in the middle of switching between mobile networks. [CHAR LIMIT=NONE] -->
<string name="sim_switch_channel_id">Carrier switching</string>
<!-- The title of post DSDS reboot notification. The title includes carrier's name. [CHAR LIMIT=NONE] -->
- <string name="post_dsds_reboot_notification_title_with_carrier"><xliff:g id="carrier_name" example="Google Fi">%1$s</xliff:g> is active</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier">Your <xliff:g id="carrier_name" example="Google Fi">%1$s</xliff:g> SIM is active</string>
<!-- The body text of post DSDS reboot notification. [CHAR LIMIT=NONE] -->
<string name="post_dsds_reboot_notification_text">Tap to update SIM settings</string>
<!-- Title on a push notification indicating that the user's device switched to a new mobile network. [CHAR LIMIT=NONE] -->
@@ -11602,17 +11617,17 @@
<!-- Strings for choose SIM activity -->
<!-- The title text of choose SIM activity. [CHAR LIMIT=NONE] -->
- <string name="choose_sim_title">Choose a number to use</string>
+ <string name="choose_sim_title">Choose a SIM to use</string>
<!-- The body text of choose SIM activity. [CHAR LIMIT=NONE] -->
<string name="choose_sim_text">{count, plural,
- =1 {1 number is available on this device, but only one can be used at a time}
- =2 {2 numbers are available on this device, but only one can be used at a time}
- other {# numbers are available on this device, but only one can be used at a time}
+ =1 {1 SIM is available on this device, but only one can be used at a time}
+ =2 {2 SIMs are available on this device, but only one can be used at a time}
+ other {# SIMs are available on this device, but only one can be used at a time}
}</string>
<!-- String indicating that we are activating the profile [CHAR LIMIT=NONE] -->
<string name="choose_sim_activating">Activating<xliff:g id="ellipsis" example="...">…</xliff:g></string>
<!-- String indicating that we failed to activate the selected profile [CHAR LIMIT=NONE] -->
- <string name="choose_sim_could_not_activate">Couldn\u2019t be activated right now</string>
+ <string name="choose_sim_could_not_activate">Couldn\u2019t activate this SIM right now</string>
<!-- Strings for switch SIM confirmation dialog. -->
<!-- The title text of switch SIM confirmation dialog. [CHAR LIMIT=NONE] -->
@@ -11967,6 +11982,11 @@
<!-- Developer settings: Summary for allowing mock modem service. [CHAR LIMIT=NONE]-->
<string name="allow_mock_modem_summary">Allow this device to run Mock Modem service for instrumentation testing. Do not enable this during normal usage of the phone</string>
+ <!-- Developer settings: Title for disable app and notification screen share protections [CHAR LIMIT=50] -->
+ <string name="disable_screen_share_protections_for_apps_and_notifications">Disable screen share protections</string>
+ <!-- Developer settings: Summary for disable app and notification screen share protections summary [CHAR LIMIT=150] -->
+ <string name="disable_screen_share_protections_for_apps_and_notifications_summary">Disables system applied app and notifications protections during screen sharing</string>
+
<!-- Title for media control settings [CHAR LIMIT=50]-->
<string name="media_controls_title">Media</string>
<!-- Title of toggle to enable or disable the media resumption feature in quick settings [CHAR LIMIT=50]-->
diff --git a/res/xml/accounts_dashboard_settings_credman.xml b/res/xml/accounts_dashboard_settings_credman.xml
index 7266bda..08377c9 100644
--- a/res/xml/accounts_dashboard_settings_credman.xml
+++ b/res/xml/accounts_dashboard_settings_credman.xml
@@ -18,7 +18,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="user_and_account_settings_screen"
- android:title="@string/account_dashboard_title"
+ android:title="@string/account_dashboard_title_with_passkeys"
settings:keywords="@string/keywords_accounts">
<PreferenceCategory
diff --git a/res/xml/accounts_personal_dashboard_settings_credman.xml b/res/xml/accounts_personal_dashboard_settings_credman.xml
index 9473e17..16ab31b 100644
--- a/res/xml/accounts_personal_dashboard_settings_credman.xml
+++ b/res/xml/accounts_personal_dashboard_settings_credman.xml
@@ -19,7 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="user_and_account_settings_screen"
- android:title="@string/account_dashboard_title"
+ android:title="@string/account_dashboard_title_with_passkeys"
settings:keywords="@string/keywords_accounts">
<PreferenceCategory
diff --git a/res/xml/accounts_private_dashboard_settings_credman.xml b/res/xml/accounts_private_dashboard_settings_credman.xml
index 54db839..c0b12b5 100644
--- a/res/xml/accounts_private_dashboard_settings_credman.xml
+++ b/res/xml/accounts_private_dashboard_settings_credman.xml
@@ -19,7 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="user_and_account_settings_screen"
- android:title="@string/account_dashboard_title"
+ android:title="@string/account_dashboard_title_with_passkeys"
settings:keywords="@string/keywords_accounts">
<PreferenceCategory
diff --git a/res/xml/accounts_work_dashboard_settings_credman.xml b/res/xml/accounts_work_dashboard_settings_credman.xml
index d649940..44bdb52 100644
--- a/res/xml/accounts_work_dashboard_settings_credman.xml
+++ b/res/xml/accounts_work_dashboard_settings_credman.xml
@@ -19,7 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="user_and_account_settings_screen"
- android:title="@string/account_dashboard_title"
+ android:title="@string/account_dashboard_title_with_passkeys"
settings:keywords="@string/keywords_accounts">
<PreferenceCategory
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index fb5e280..c0b6560 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -705,6 +705,11 @@
android:title="@string/show_notification_channel_warnings"
android:summary="@string/show_notification_channel_warnings_summary" />
+ <SwitchPreferenceCompat
+ android:key="disable_screen_share_protections_for_apps_and_notifications"
+ android:title="@string/disable_screen_share_protections_for_apps_and_notifications"
+ android:summary="@string/disable_screen_share_protections_for_apps_and_notifications_summary" />
+
<Preference
android:key="asst_importance_reset"
android:title="@string/asst_importance_reset_title"
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
index b5d0c59..a29e123 100644
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -48,6 +48,23 @@
settings:controller="com.android.settings.network.telephony.SmsDefaultSubscriptionController"/>
<Preference
+ android:key="mobile_network_spn"
+ android:title="@string/mobile_network_spn_title"
+ android:summary="@string/summary_placeholder"
+ android:selectable="false"
+ settings:controller="com.android.settings.network.telephony.MobileNetworkSpnPreferenceController"
+ settings:allowDividerAbove="true" />
+
+ <Preference
+ android:key="phone_number"
+ android:title="@string/status_number"
+ android:summary="@string/summary_placeholder"
+ android:selectable="false"
+ settings:controller="com.android.settings.network.telephony.MobileNetworkPhoneNumberPreferenceController"
+ settings:allowDividerBelow="true"
+ settings:enableCopying="true"/>
+
+ <Preference
android:key="cdma_lte_data_service_key"
android:title="@string/cdma_lte_data_service"
settings:controller="com.android.settings.network.telephony.DataServiceSetupPreferenceController"
@@ -162,6 +179,24 @@
settings:controller="com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController"
settings:enableCopying="true"/>
+ <!-- IMEI -->
+ <Preference
+ android:key="network_mode_imei_info"
+ android:title="@string/status_imei"
+ android:summary="@string/summary_placeholder"
+ settings:keywords="@string/keywords_imei_info"
+ settings:enableCopying="true"
+ settings:controller="com.android.settings.network.telephony.MobileNetworkImeiPreferenceController"/>
+ <!-- EID -->
+ <com.android.settingslib.CustomDialogPreferenceCompat
+ android:key="network_mode_eid_info"
+ android:title="@string/status_eid"
+ android:summary="@string/device_info_protected_single_press"
+ android:positiveButtonText="@string/dlg_ok"
+ android:dialogLayout="@layout/dialog_eid_status"
+ settings:enableCopying="true"
+ settings:controller="com.android.settings.network.telephony.MobileNetworkEidPreferenceController"/>
+
<PreferenceCategory
android:key="calling_category"
android:title="@string/call_category"
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 29c3c62..62bc040 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -52,11 +52,12 @@
settings:controller="com.android.settings.deviceinfo.BrandedAccountPreferenceController"/>
<!-- Phone number -->
- <com.android.settings.deviceinfo.PhoneNumberSummaryPreference
+ <Preference
android:key="phone_number"
android:order="3"
android:title="@string/status_number"
android:summary="@string/summary_placeholder"
+ android:selectable="false"
settings:isPreferenceVisible="@bool/config_show_sim_info"
settings:controller="com.android.settings.deviceinfo.PhoneNumberPreferenceController"
settings:enableCopying="true"/>
@@ -118,7 +119,6 @@
android:key="eid_info"
android:order="31"
android:title="@string/status_eid"
- android:summary="@string/device_info_protected_single_press"
android:positiveButtonText="@string/dlg_ok"
android:dialogLayout="@layout/dialog_eid_status"
settings:isPreferenceVisible="@bool/config_show_sim_info"
@@ -126,7 +126,7 @@
settings:controller="com.android.settings.deviceinfo.simstatus.SimEidPreferenceController"/>
<!-- IMEI -->
- <com.android.settings.deviceinfo.PhoneNumberSummaryPreference
+ <Preference
android:key="imei_info"
android:order="32"
android:title="@string/status_imei"
diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml
index 244c792..a3dfbf2 100644
--- a/res/xml/private_space_settings.xml
+++ b/res/xml/private_space_settings.xml
@@ -65,7 +65,7 @@
<Preference
android:key="private_space_delete"
android:title="@string/private_space_delete_title"
- settings:controller="com.android.settings.privatespace.DeletePrivateSpaceController"
+ settings:controller="com.android.settings.privatespace.delete.DeletePrivateSpaceController"
settings:searchable="false" />
</PreferenceCategory>
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index d050a1f..31c6af3 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -180,7 +180,7 @@
android:icon="@drawable/ic_settings_accounts"
android:key="top_level_accounts"
android:order="-10"
- android:title="@string/account_dashboard_title"
+ android:title="@string/account_dashboard_title_with_passkeys"
android:summary="@string/summary_placeholder"
settings:highlightableMenuKey="@string/menu_key_accounts"
settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceConfig.java b/src/com/android/settings/accessibility/VibrationPreferenceConfig.java
index c25c38e..a304862 100644
--- a/src/com/android/settings/accessibility/VibrationPreferenceConfig.java
+++ b/src/com/android/settings/accessibility/VibrationPreferenceConfig.java
@@ -150,9 +150,13 @@
@VibrationAttributes.Usage int vibrationUsage) {
return new VibrationAttributes.Builder()
.setUsage(vibrationUsage)
- // Enforce fresh settings to be applied for the preview vibration, as they
- // are played immediately after the new user values are set.
- .setFlags(VibrationAttributes.FLAG_INVALIDATE_SETTINGS_CACHE)
+ .setFlags(
+ // Enforce fresh settings to be applied for the preview vibration, as they
+ // are played immediately after the new user values are set.
+ VibrationAttributes.FLAG_INVALIDATE_SETTINGS_CACHE
+ // Bypass user settings to allow vibration previews to be played while in
+ // limited interruptions' mode, e.g. zen mode.
+ | VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY)
.build();
}
diff --git a/src/com/android/settings/applications/AppCounter.java b/src/com/android/settings/applications/AppCounter.java
index d536932..2b1e47e 100644
--- a/src/com/android/settings/applications/AppCounter.java
+++ b/src/com/android/settings/applications/AppCounter.java
@@ -22,12 +22,15 @@
import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.UserInfo;
import android.os.AsyncTask;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
+import com.android.settings.flags.Flags;
+
import java.util.List;
public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
@@ -54,7 +57,7 @@
for (UserInfo user : mUm.getProfiles(UserHandle.myUserId())) {
long flags = PackageManager.GET_DISABLED_COMPONENTS
| PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
- | (mFf.archiving() ? PackageManager.MATCH_ARCHIVED_PACKAGES : 0)
+ | (isArchivingEnabled() ? PackageManager.MATCH_ARCHIVED_PACKAGES : 0)
| (user.isAdmin() ? PackageManager.MATCH_ANY_USER : 0);
ApplicationInfoFlags infoFlags = ApplicationInfoFlags.of(flags);
final List<ApplicationInfo> list =
@@ -68,6 +71,11 @@
return count;
}
+ private boolean isArchivingEnabled() {
+ return mFf.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
+ || Flags.appArchiving();
+ }
+
@Override
protected void onPostExecute(Integer count) {
onCountComplete(count);
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index 0ccbe5b..b80de32 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -32,6 +32,7 @@
import android.content.om.OverlayInfo;
import android.content.om.OverlayManager;
import android.content.pm.ApplicationInfo;
+import android.content.pm.Flags;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
@@ -434,10 +435,17 @@
// No preferred default, so permit uninstall only when
// there is more than one candidate
enabled = (mHomePackages.size() > 1);
- } else {
- // There is an explicit default home app -- forbid uninstall of
- // that one, but permit it for installed-but-inactive ones.
- enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName());
+ } else if (mPackageInfo.packageName.equals(currentDefaultHome.getPackageName())) {
+ if (Flags.improveHomeAppBehavior()) {
+ // Allow uninstallation of current home app if it is a non-system app
+ // and/or there are other candidate apps available.
+ if (mPackageInfo.applicationInfo.isSystemApp()
+ || mHomePackages.size() == 1) {
+ enabled = false;
+ }
+ } else {
+ enabled = false;
+ }
}
}
}
diff --git a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
index f8a3b0f..4f27870 100644
--- a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
+++ b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
@@ -16,6 +16,7 @@
package com.android.settings.applications.credentials;
+import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -24,7 +25,6 @@
import android.credentials.CredentialProviderInfo;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
-import android.os.UserManager;
import android.service.autofill.AutofillServiceInfo;
import android.text.TextUtils;
import android.util.IconDrawableFactory;
@@ -49,7 +49,7 @@
private static final String TAG = "CombinedProviderInfo";
private static final String SETTINGS_ACTIVITY_INTENT_ACTION = "android.intent.action.MAIN";
private static final String SETTINGS_ACTIVITY_INTENT_CATEGORY =
- "android.intent.category.LAUNCHER";
+ "android.intent.category.DEFAULT";
private final List<CredentialProviderInfo> mCredentialProviderInfos;
private final @Nullable AutofillServiceInfo mAutofillServiceInfo;
@@ -327,10 +327,8 @@
}
public static @Nullable Intent createSettingsActivityIntent(
- @NonNull Context context,
@Nullable CharSequence packageName,
- @Nullable CharSequence settingsActivity,
- int currentUserId) {
+ @Nullable CharSequence settingsActivity) {
if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(settingsActivity)) {
return null;
}
@@ -350,19 +348,25 @@
Intent intent = new Intent(SETTINGS_ACTIVITY_INTENT_ACTION);
intent.addCategory(SETTINGS_ACTIVITY_INTENT_CATEGORY);
intent.setComponent(cn);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return intent;
+ }
- int contextUserId = context.getUser().getIdentifier();
- if (currentUserId != contextUserId && UserManager.isHeadlessSystemUserMode()) {
- Log.w(
- TAG,
- "onLeftSideClicked(): using context for current user ("
- + currentUserId
- + ") instead of user "
- + contextUserId
- + " on headless system user mode");
- context = context.createContextAsUser(UserHandle.of(currentUserId), /* flags= */ 0);
+ /** Launches the settings activity intent. */
+ public static void launchSettingsActivityIntent(
+ @NonNull Context context,
+ @Nullable CharSequence packageName,
+ @Nullable CharSequence settingsActivity,
+ int userId) {
+ Intent settingsIntent = createSettingsActivityIntent(packageName, settingsActivity);
+ if (settingsIntent == null) {
+ return;
}
- return intent;
+ try {
+ context.startActivityAsUser(settingsIntent, UserHandle.of(userId));
+ } catch (ActivityNotFoundException e) {
+ Log.e(TAG, "Failed to open settings activity", e);
+ }
}
}
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index 2f04b62..d98bc51 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -20,7 +20,6 @@
import android.app.Activity;
import android.app.Dialog;
-import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -46,6 +45,7 @@
import android.service.autofill.AutofillServiceInfo;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Pair;
import android.view.View;
import android.widget.CompoundButton;
@@ -77,6 +77,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executor;
@@ -114,7 +115,7 @@
private @Nullable String mFlagOverrideForTest = null;
private @Nullable PreferenceScreen mPreferenceScreen = null;
- private boolean mVisibility = false;
+ private Optional<Boolean> mSimulateHiddenForTests = Optional.empty();
private boolean mIsWorkProfile = false;
private boolean mSimulateConnectedForTests = false;
@@ -159,7 +160,9 @@
return UNSUPPORTED_ON_DEVICE;
}
- if (!mVisibility) {
+ // If there is no top provider or any providers in the list then
+ // we should hide this pref.
+ if (isHiddenDueToNoProviderSet()) {
return CONDITIONALLY_UNAVAILABLE;
}
@@ -378,20 +381,29 @@
}
@VisibleForTesting
- public void setVisibility(boolean newVisibility) {
- if (newVisibility == mVisibility) {
- return;
- }
-
- mVisibility = newVisibility;
+ public void forceDelegateRefresh() {
if (mDelegate != null) {
mDelegate.forceDelegateRefresh();
}
}
@VisibleForTesting
- public boolean getVisibility() {
- return mVisibility;
+ public void setSimulateHiddenForTests(Optional<Boolean> simulateHiddenForTests) {
+ mSimulateHiddenForTests = simulateHiddenForTests;
+ }
+
+ @VisibleForTesting
+ public boolean isHiddenDueToNoProviderSet() {
+ return isHiddenDueToNoProviderSet(getProviders());
+ }
+
+ private boolean isHiddenDueToNoProviderSet(
+ Pair<List<CombinedProviderInfo>, CombinedProviderInfo> providerPair) {
+ if (mSimulateHiddenForTests.isPresent()) {
+ return mSimulateHiddenForTests.get();
+ }
+
+ return (providerPair.first.size() == 0 || providerPair.second == null);
}
@VisibleForTesting
@@ -459,10 +471,11 @@
return preference;
}
- /** Aggregates the list of services and builds a list of UI prefs to show. */
- @VisibleForTesting
- public Map<String, CombiPreference> buildPreferenceList(
- Context context, PreferenceGroup group) {
+ /**
+ * Returns a pair that contains a list of the providers in the first position and the top
+ * provider in the second position.
+ */
+ private Pair<List<CombinedProviderInfo>, CombinedProviderInfo> getProviders() {
// Get the selected autofill provider. If it is the placeholder then replace it with an
// empty string.
String selectedAutofillProvider =
@@ -475,15 +488,25 @@
// Get the list of combined providers.
List<CombinedProviderInfo> providers =
CombinedProviderInfo.buildMergedList(
- AutofillServiceInfo.getAvailableServices(context, getUser()),
+ AutofillServiceInfo.getAvailableServices(mContext, getUser()),
mServices,
selectedAutofillProvider);
+ return new Pair<>(providers, CombinedProviderInfo.getTopProvider(providers));
+ }
- // Get the provider that is displayed at the top. If there is none then hide
- // everything.
- CombinedProviderInfo topProvider = CombinedProviderInfo.getTopProvider(providers);
- if (topProvider == null) {
- setVisibility(false);
+ /** Aggregates the list of services and builds a list of UI prefs to show. */
+ @VisibleForTesting
+ public @NonNull Map<String, CombiPreference> buildPreferenceList(
+ @NonNull Context context, @NonNull PreferenceGroup group) {
+ // Get the providers and extract the values.
+ Pair<List<CombinedProviderInfo>, CombinedProviderInfo> providerPair = getProviders();
+ CombinedProviderInfo topProvider = providerPair.second;
+ List<CombinedProviderInfo> providers = providerPair.first;
+
+ // If the provider is set to "none" or there are no providers then we should not
+ // return any providers.
+ if (isHiddenDueToNoProviderSet(providerPair)) {
+ forceDelegateRefresh();
return new HashMap<>();
}
@@ -520,7 +543,7 @@
}
// Set the visibility if we have services.
- setVisibility(!output.isEmpty());
+ forceDelegateRefresh();
return output;
}
@@ -653,16 +676,8 @@
@Override
public void onLeftSideClicked() {
- Intent settingsIntent =
- CombinedProviderInfo.createSettingsActivityIntent(
- mContext, packageName, settingsActivity, getUser());
- if (settingsIntent != null) {
- try {
- mContext.startActivity(settingsIntent);
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "Failed to open settings activity", e);
- }
- }
+ CombinedProviderInfo.launchSettingsActivityIntent(
+ mContext, packageName, settingsActivity, getUser());
}
});
diff --git a/src/com/android/settings/applications/credentials/CredentialsPickerActivity.java b/src/com/android/settings/applications/credentials/CredentialsPickerActivity.java
index 495c104..479a184 100644
--- a/src/com/android/settings/applications/credentials/CredentialsPickerActivity.java
+++ b/src/com/android/settings/applications/credentials/CredentialsPickerActivity.java
@@ -16,15 +16,53 @@
package com.android.settings.applications.credentials;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.SettingsActivity;
-/** Standalone activity used to launch a {@link DefaultCombinedPicker} fragment. */
+/**
+ * Standalone activity used to launch a {@link DefaultCombinedPicker} fragment if the user is a
+ * normal user, a {@link DefaultCombinedPickerWork} fragment if the user is a work profile or {@link
+ * DefaultCombinedPickerPrivate} fragment if the user is a private profile.
+ */
public class CredentialsPickerActivity extends SettingsActivity {
+ private static final String TAG = "CredentialsPickerActivity";
+
+ /** Injects the fragment name into the intent so the correct fragment is opened. */
+ @VisibleForTesting
+ public static void injectFragmentIntoIntent(Context context, Intent intent) {
+ final int userId = UserHandle.myUserId();
+ final UserManager userManager = UserManager.get(context);
+
+ if (DefaultCombinedPickerWork.isUserHandledByFragment(userManager, userId)) {
+ Slog.d(TAG, "Creating picker fragment using work profile");
+ intent.putExtra(EXTRA_SHOW_FRAGMENT, DefaultCombinedPickerWork.class.getName());
+ } else if (DefaultCombinedPickerPrivate.isUserHandledByFragment(userManager)) {
+ Slog.d(TAG, "Creating picker fragment using private profile");
+ intent.putExtra(EXTRA_SHOW_FRAGMENT, DefaultCombinedPickerPrivate.class.getName());
+ } else {
+ Slog.d(TAG, "Creating picker fragment using normal profile");
+ intent.putExtra(EXTRA_SHOW_FRAGMENT, DefaultCombinedPicker.class.getName());
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ injectFragmentIntoIntent(this, getIntent());
+ super.onCreate(savedInstanceState);
+ }
@Override
protected boolean isValidFragment(String fragmentName) {
return super.isValidFragment(fragmentName)
- || DefaultCombinedPicker.class.getName().equals(fragmentName);
+ || DefaultCombinedPicker.class.getName().equals(fragmentName)
+ || DefaultCombinedPickerWork.class.getName().equals(fragmentName)
+ || DefaultCombinedPickerPrivate.class.getName().equals(fragmentName);
}
}
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java b/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java
index 722cb1a..8d8af0e 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java
@@ -17,14 +17,29 @@
package com.android.settings.applications.credentials;
import android.os.UserManager;
+import android.util.Slog;
import com.android.settings.Utils;
import com.android.settings.dashboard.profileselector.ProfileSelectFragment.ProfileType;
public class DefaultCombinedPickerPrivate extends DefaultCombinedPicker {
+ private static final String TAG = "DefaultCombinedPickerPrivate";
+
@Override
protected int getUser() {
UserManager userManager = getContext().getSystemService(UserManager.class);
return Utils.getCurrentUserIdOfType(userManager, ProfileType.PRIVATE);
}
+
+ /** Returns whether the user is handled by this fragment. */
+ public static boolean isUserHandledByFragment(UserManager userManager) {
+ try {
+ // If there is no private profile then this will throw an exception.
+ Utils.getCurrentUserIdOfType(userManager, ProfileType.PRIVATE);
+ return true;
+ } catch (IllegalStateException e) {
+ Slog.e(TAG, "Failed to get private profile user id", e);
+ return false;
+ }
+ }
}
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPickerWork.java b/src/com/android/settings/applications/credentials/DefaultCombinedPickerWork.java
index 9808502..945d6b8 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPickerWork.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPickerWork.java
@@ -19,13 +19,16 @@
import android.os.UserHandle;
import android.os.UserManager;
-import com.android.settings.Utils;
-
public class DefaultCombinedPickerWork extends DefaultCombinedPicker {
+ private static final String TAG = "DefaultCombinedPickerWork";
@Override
protected int getUser() {
- UserHandle workProfile = Utils.getManagedProfile(UserManager.get(getContext()));
- return workProfile.getIdentifier();
+ return UserHandle.myUserId();
+ }
+
+ /** Returns whether the user is handled by this fragment. */
+ public static boolean isUserHandledByFragment(UserManager userManager, int userId) {
+ return userManager.isManagedProfile(userId);
}
}
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
index 0fb1769..49dd7cd 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
@@ -16,7 +16,6 @@
package com.android.settings.applications.credentials;
-import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.credentials.CredentialManager;
@@ -26,11 +25,11 @@
import android.provider.Settings;
import android.service.autofill.AutofillService;
import android.service.autofill.AutofillServiceInfo;
+import android.text.TextUtils;
import android.view.autofill.AutofillManager;
-import android.util.Slog;
-import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.preference.Preference;
import com.android.internal.annotations.VisibleForTesting;
@@ -83,7 +82,7 @@
// hand side presses to align the UX.
if (PrimaryProviderPreference.shouldUseNewSettingsUi()) {
// We need to return an empty intent here since the class we inherit
- // from will throw an NPE if we return null and we don't want it to
+ // from will throw an NPE if we return null and we don't want it to
// open anything since we added the buttons.
return new Intent();
}
@@ -99,10 +98,10 @@
topProvider.getAppName(mContext),
topProvider.getSettingsSubtitle(),
topProvider.getAppIcon(mContext, getUser()),
- createSettingsActivityIntent(
- topProvider.getPackageName(), topProvider.getSettingsActivity()));
+ topProvider.getPackageName(),
+ topProvider.getSettingsActivity());
} else {
- updatePreferenceForProvider(preference, null, null, null, null);
+ updatePreferenceForProvider(preference, null, null, null, null, null);
}
}
@@ -112,7 +111,8 @@
@Nullable CharSequence appName,
@Nullable String appSubtitle,
@Nullable Drawable appIcon,
- @Nullable Intent settingsActivityIntent) {
+ @Nullable CharSequence packageName,
+ @Nullable CharSequence settingsActivity) {
if (appName == null) {
preference.setTitle(R.string.app_list_preference_none);
} else {
@@ -133,13 +133,8 @@
primaryPref.setDelegate(
new PrimaryProviderPreference.Delegate() {
public void onOpenButtonClicked() {
- if (settingsActivityIntent != null) {
- try {
- startActivity(settingsActivityIntent);
- } catch (ActivityNotFoundException e) {
- Slog.e(TAG, "Failed to open settings activity", e);
- }
- }
+ CombinedProviderInfo.launchSettingsActivityIntent(
+ mContext, packageName, settingsActivity, getUser());
}
public void onChangeButtonClicked() {
@@ -148,7 +143,7 @@
});
// Hide the open button if there is no defined settings activity.
- primaryPref.setOpenButtonVisible(settingsActivityIntent != null);
+ primaryPref.setOpenButtonVisible(!TextUtils.isEmpty(settingsActivity));
primaryPref.setButtonsVisible(appName != null);
}
}
@@ -198,13 +193,8 @@
/** Creates an intent to open the credential picker. */
private Intent createIntentToOpenPicker() {
- return new Intent(mContext, CredentialsPickerActivity.class);
- }
-
- /** Creates an intent to open the settings activity of the primary provider (if available). */
- public @Nullable Intent createSettingsActivityIntent(
- @Nullable String packageName, @Nullable String settingsActivity) {
- return CombinedProviderInfo.createSettingsActivityIntent(
- mContext, packageName, settingsActivity, getUser());
+ final Context context =
+ mContext.createContextAsUser(UserHandle.of(getUser()), /* flags= */ 0);
+ return new Intent(context, CredentialsPickerActivity.class);
}
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 292d977..335d0b9 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -40,6 +40,7 @@
import com.android.settings.core.InstrumentedActivity;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settingslib.activityembedding.ActivityEmbeddingUtils;
import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
import com.android.systemui.unfold.updates.FoldProvider;
@@ -173,6 +174,14 @@
mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId());
mPostureGuidanceIntent = FeatureFactory.getFeatureFactory()
.getFaceFeatureProvider().getPostureGuidanceIntent(getApplicationContext());
+
+ // Remove the existing split screen dialog.
+ BiometricsSplitScreenDialog dialog =
+ (BiometricsSplitScreenDialog) getSupportFragmentManager()
+ .findFragmentByTag(BiometricsSplitScreenDialog.class.getName());
+ if (dialog != null) {
+ getSupportFragmentManager().beginTransaction().remove(dialog).commit();
+ }
}
@Override
@@ -338,4 +347,8 @@
final ColorStateList stateList = Utils.getColorAttr(this, android.R.attr.windowBackground);
return stateList != null ? stateList.getDefaultColor() : Color.TRANSPARENT;
}
+
+ protected boolean shouldShowSplitScreenDialog() {
+ return isInMultiWindowMode() && !ActivityEmbeddingUtils.isActivityEmbedded(this);
+ }
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 44b1b3b..1b9a70f 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -154,6 +154,12 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (shouldShowSplitScreenDialog()) {
+ BiometricsSplitScreenDialog
+ .newInstance(getModality(), !WizardManagerHelper.isAnySetupWizard(getIntent()))
+ .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName());
+ }
+
if (savedInstanceState != null) {
mConfirmingCredentials = savedInstanceState.getBoolean(KEY_CONFIRMING_CREDENTIALS);
mHasScrolledToBottom = savedInstanceState.getBoolean(KEY_SCROLLED_TO_BOTTOM);
@@ -293,6 +299,13 @@
@Override
protected void onNextButtonClick(View view) {
+ // If it's not on suw, this method shouldn't be accessed.
+ if (shouldShowSplitScreenDialog() && WizardManagerHelper.isAnySetupWizard(getIntent())) {
+ BiometricsSplitScreenDialog.newInstance(getModality(), false /*destroyActivity*/)
+ .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName());
+ return;
+ }
+
mNextClicked = true;
if (checkMaxEnrolled() == 0) {
// Lock thingy is already set up, launch directly to the next page
diff --git a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
index e4f2586..1e1a142 100644
--- a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
@@ -97,6 +97,14 @@
}
public void startEnrollment() {
+ // If it's in multi window mode, dialog is shown, do not start enrollment.
+ if (shouldShowSplitScreenDialog()) {
+ return;
+ }
+ startEnrollmentInternal();
+ }
+
+ protected void startEnrollmentInternal() {
mSidecar = (BiometricEnrollSidecar) getSupportFragmentManager()
.findFragmentByTag(TAG_SIDECAR);
if (mSidecar == null) {
diff --git a/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java b/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java
index c1ecee8..79feb0b 100644
--- a/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java
+++ b/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java
@@ -18,6 +18,8 @@
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_SKIP;
+
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
@@ -34,23 +36,33 @@
*/
public class BiometricsSplitScreenDialog extends InstrumentedDialogFragment {
private static final String KEY_BIOMETRICS_MODALITY = "biometrics_modality";
+ private static final String KEU_DESTROY_ACTIVITY = "destroy_activity";
@BiometricAuthenticator.Modality
private int mBiometricsModality;
+ private boolean mDestroyActivity;
- /** Returns the new instance of the class */
+ /**
+ * Returns the new instance of the class
+ * @param biometricsModality Biometric modality.
+ * @param destroyActivity Whether to destroy the activity
+ * @return the current {@link BiometricsSplitScreenDialog}
+ */
public static BiometricsSplitScreenDialog newInstance(
- @BiometricAuthenticator.Modality int biometricsModality) {
+ @BiometricAuthenticator.Modality int biometricsModality, boolean destroyActivity) {
final BiometricsSplitScreenDialog dialog = new BiometricsSplitScreenDialog();
final Bundle args = new Bundle();
args.putInt(KEY_BIOMETRICS_MODALITY, biometricsModality);
+ args.putBoolean(KEU_DESTROY_ACTIVITY, destroyActivity);
dialog.setArguments(args);
+ dialog.setCancelable(false);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mBiometricsModality = getArguments().getInt(KEY_BIOMETRICS_MODALITY);
+ mDestroyActivity = getArguments().getBoolean(KEU_DESTROY_ACTIVITY);
int titleId;
int messageId;
switch (mBiometricsModality) {
@@ -65,9 +77,16 @@
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(titleId)
.setMessage(messageId)
+ .setCancelable(false)
.setPositiveButton(
R.string.biometric_settings_add_biometrics_in_split_mode_ok,
- (DialogInterface.OnClickListener) (dialog, which) -> dialog.dismiss());
+ (DialogInterface.OnClickListener) (dialog, which) -> {
+ dialog.dismiss();
+ if (mDestroyActivity) {
+ getActivity().setResult(RESULT_SKIP);
+ getActivity().finish();
+ }
+ });
return builder.create();
}
diff --git a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java
index d8d3484..b174788 100644
--- a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java
+++ b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java
@@ -16,8 +16,6 @@
package com.android.settings.biometrics.combination;
import static android.app.Activity.RESULT_OK;
-import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
-import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED;
@@ -48,12 +46,10 @@
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricStatusPreferenceController;
import com.android.settings.biometrics.BiometricUtils;
-import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockSettingsHelper;
-import com.android.settingslib.activityembedding.ActivityEmbeddingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.transition.SettingsTransitionHelper;
@@ -167,18 +163,6 @@
// since FingerprintSettings and FaceSettings revoke the challenge when finishing.
if (getFacePreferenceKey().equals(key)) {
mDoNotFinishActivity = true;
-
- // If it's split mode and there is no enrolled face, show the dialog. (if there is
- // enrolled face, FaceSettingsEnrollButtonPreferenceController#onClick will handle
- // the dialog)
- if (getActivity().isInMultiWindowMode() && !ActivityEmbeddingUtils.isActivityEmbedded(
- getActivity()) && !mFaceManager.hasEnrolledTemplates(mUserId)) {
- BiometricsSplitScreenDialog.newInstance(TYPE_FACE).show(
- getActivity().getSupportFragmentManager(),
- BiometricsSplitScreenDialog.class.getName());
- return true;
- }
-
mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
final Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
@@ -209,18 +193,6 @@
return true;
} else if (getFingerprintPreferenceKey().equals(key)) {
mDoNotFinishActivity = true;
-
- // If it's split mode and there is no enrolled fingerprint, show the dialog. (if
- // there is enrolled fingerprint, FingerprintSettingsFragment#onPreferenceTreeClick
- // will handle the dialog)
- if (getActivity().isInMultiWindowMode() && !ActivityEmbeddingUtils.isActivityEmbedded(
- getActivity()) && !mFingerprintManager.hasEnrolledFingerprints(mUserId)) {
- BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT).show(
- getActivity().getSupportFragmentManager(),
- BiometricsSplitScreenDialog.class.getName());
- return true;
- }
-
mFingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
final Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
index 472410b..e8bd0ef 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
@@ -16,6 +16,8 @@
package com.android.settings.biometrics.face;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+
import android.app.settings.SettingsEnums;
import android.content.Intent;
import android.hardware.face.FaceManager;
@@ -33,6 +35,7 @@
import com.android.settings.biometrics.BiometricErrorDialog;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.BiometricsEnrollEnrolling;
+import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.slices.CustomSliceRegistry;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -88,6 +91,10 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (shouldShowSplitScreenDialog()) {
+ BiometricsSplitScreenDialog.newInstance(TYPE_FACE, true /*destroyActivity*/)
+ .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName());
+ }
setContentView(R.layout.face_enroll_enrolling);
setHeaderText(R.string.security_settings_face_enroll_repeat_title);
mErrorText = findViewById(R.id.error_text);
@@ -134,7 +141,7 @@
}
@Override
- public void startEnrollment() {
+ protected void startEnrollmentInternal() {
super.startEnrollment();
mPreviewFragment = (FaceEnrollPreviewFragment) getSupportFragmentManager()
.findFragmentByTag(TAG_FACE_PREVIEW);
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index bebb5c7..197aca0 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -18,7 +18,6 @@
import static android.app.Activity.RESULT_OK;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
-import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
@@ -43,12 +42,10 @@
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
-import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.activityembedding.ActivityEmbeddingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.LayoutPreference;
@@ -104,26 +101,8 @@
mEnrollButton.setVisible(true);
};
- private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener =
- new FaceSettingsEnrollButtonPreferenceController.Listener() {
- @Override
- public boolean onShowSplitScreenDialog() {
- if (getActivity().isInMultiWindowMode()
- && !ActivityEmbeddingUtils.isActivityEmbedded(getActivity())) {
- // If it's in split mode, show the error dialog.
- BiometricsSplitScreenDialog.newInstance(TYPE_FACE).show(
- getActivity().getSupportFragmentManager(),
- BiometricsSplitScreenDialog.class.getName());
- return true;
- }
- return false;
- }
-
- @Override
- public void onStartEnrolling(Intent intent) {
- FaceSettings.this.startActivityForResult(intent, ENROLL_REQUEST);
- }
- };
+ private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener = intent ->
+ startActivityForResult(intent, ENROLL_REQUEST);
/**
* @param context
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java
index 50e4248..e5f7c4f 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java
@@ -75,11 +75,6 @@
@Override
public void onClick(View v) {
- // If it's in multi window mode, do not start the introduction intent.
- if (mListener != null && mListener.onShowSplitScreenDialog()) {
- return;
- }
-
mIsClicked = true;
final Intent intent = new Intent();
intent.setClassName(SETTINGS_PACKAGE_NAME, FaceEnrollIntroduction.class.getName());
@@ -121,12 +116,6 @@
*/
public interface Listener {
/**
- * Called to check whether to show dialog in split screen mode
- * @return Whether split screen warning dialog shown.
- */
- boolean onShowSplitScreenDialog();
-
- /**
* Called when the user has indicated an intent to begin enrolling a new face.
* @param intent The Intent that should be used to launch face enrollment.
*/
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index c7f73cb..175e8f9 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -16,6 +16,7 @@
package com.android.settings.biometrics.fingerprint;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
import static android.text.Layout.HYPHENATION_FREQUENCY_NONE;
import android.animation.Animator;
@@ -67,6 +68,7 @@
import com.android.settings.biometrics.BiometricEnrollSidecar;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.BiometricsEnrollEnrolling;
+import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.flags.Flags;
@@ -223,7 +225,10 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+ if (shouldShowSplitScreenDialog()) {
+ BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT, true /*destroyActivity*/)
+ .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName());
+ }
if (savedInstanceState != null) {
restoreSavedState(savedInstanceState);
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 4d1d499..2aacbe4 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -20,7 +20,6 @@
import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED_EXPLANATION;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE;
import static android.app.admin.DevicePolicyResources.UNDEFINED;
-import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY;
@@ -68,7 +67,6 @@
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
-import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.biometrics.GatekeeperPasswordProvider;
import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity;
@@ -84,7 +82,6 @@
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedSwitchPreference;
-import com.android.settingslib.activityembedding.ActivityEmbeddingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.transition.SettingsTransitionHelper;
@@ -790,17 +787,6 @@
public boolean onPreferenceTreeClick(Preference pref) {
final String key = pref.getKey();
if (KEY_FINGERPRINT_ADD.equals(key)) {
- // If it's in split mode, show the error dialog and don't need to show adding
- // fingerprint intent.
- final boolean isActivityEmbedded = ActivityEmbeddingUtils.isActivityEmbedded(
- getActivity());
- if (getActivity().isInMultiWindowMode() && !isActivityEmbedded) {
- BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT).show(
- getActivity().getSupportFragmentManager(),
- BiometricsSplitScreenDialog.class.getName());
- return true;
- }
-
mIsEnrolling = true;
Intent intent = new Intent();
if (FeatureFlagUtils.isEnabled(getContext(),
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index de2a1ee..06307a4 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -134,6 +134,7 @@
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ // TODO(b/299573056): Show split screen dialog when it's in multi window mode.
setContentView(R.layout.fingerprint_v2_enroll_main)
setTheme(SetupWizardUtils.getTheme(applicationContext, intent))
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java
index 18ad210..3d85ca2 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java
@@ -38,7 +38,8 @@
public class BluetoothDetailsHearingDeviceControlsController extends BluetoothDetailsController
implements Preference.OnPreferenceClickListener {
- private static final String KEY_DEVICE_CONTROLS_GENERAL_GROUP = "device_controls_general";
+ @VisibleForTesting
+ static final String KEY_DEVICE_CONTROLS_GENERAL_GROUP = "device_controls_general";
@VisibleForTesting
static final String KEY_HEARING_DEVICE_CONTROLS = "hearing_device_controls";
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index 5e41a20..9c68c9c 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -22,6 +22,7 @@
import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
+import android.content.Intent;
import android.content.res.TypedArray;
import android.hardware.input.InputManager;
import android.net.Uri;
@@ -53,6 +54,7 @@
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
@@ -324,8 +326,11 @@
lifecycle));
controllers.add(new BluetoothDetailsPairOtherController(context, this, mCachedDevice,
lifecycle));
- controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this,
- mCachedDevice, lifecycle));
+ // Don't need to show hearing device again when launched from the same page.
+ if (!isLaunchFromHearingDevicePage()) {
+ controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this,
+ mCachedDevice, lifecycle));
+ }
controllers.add(new BluetoothDetailsDataSyncController(context, this,
mCachedDevice, lifecycle));
controllers.add(
@@ -348,6 +353,16 @@
return width;
}
+ private boolean isLaunchFromHearingDevicePage() {
+ final Intent intent = getIntent();
+ if (intent == null) {
+ return false;
+ }
+
+ return intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
+ SettingsEnums.PAGE_UNKNOWN) == SettingsEnums.ACCESSIBILITY_HEARING_AID_SETTINGS;
+ }
+
@VisibleForTesting
void setTitleForInputDevice() {
if (StylusDevicesController.isDeviceStylus(mInputDevice, mCachedDevice)) {
diff --git a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
index 489c095..012220c 100644
--- a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java
@@ -24,6 +24,8 @@
import androidx.preference.Preference;
import com.android.settings.connecteddevice.DevicePreferenceCallback;
+import com.android.settings.flags.Flags;
+import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
/**
@@ -95,6 +97,15 @@
cachedDevice.getName() + ", isFilterMatched : " + isFilterMatched);
}
}
+ if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+ if (BluetoothUtils.isExclusivelyManagedBluetoothDevice(mContext,
+ cachedDevice.getDevice())) {
+ if (DBG) {
+ Log.d(TAG, "isFilterMatched() hide BluetoothDevice with exclusive manager");
+ }
+ return false;
+ }
+ }
return isFilterMatched;
}
diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
index bfd4221..1db90fa 100644
--- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
@@ -25,6 +25,8 @@
import androidx.preference.Preference;
import com.android.settings.connecteddevice.DevicePreferenceCallback;
+import com.android.settings.flags.Flags;
+import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
@@ -99,12 +101,22 @@
@Override
public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
final BluetoothDevice device = cachedDevice.getDevice();
- Log.d(TAG, "isFilterMatched() device name : " + cachedDevice.getName() +
- ", is connected : " + device.isConnected() + ", is profile connected : "
- + cachedDevice.isConnected());
- return device.getBondState() == BluetoothDevice.BOND_BONDED
- && (mShowConnectedDevice || (!device.isConnected() && isDeviceInCachedDevicesList(
- cachedDevice)));
+ boolean isExclusivelyManaged = BluetoothUtils.isExclusivelyManagedBluetoothDevice(mContext,
+ cachedDevice.getDevice());
+ Log.d(TAG, "isFilterMatched() device name : " + cachedDevice.getName()
+ + ", is connected : " + device.isConnected() + ", is profile connected : "
+ + cachedDevice.isConnected() + ", is exclusively managed : "
+ + isExclusivelyManaged);
+ if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+ return device.getBondState() == BluetoothDevice.BOND_BONDED
+ && (mShowConnectedDevice || (!device.isConnected()
+ && isDeviceInCachedDevicesList(cachedDevice)))
+ && !isExclusivelyManaged;
+ } else {
+ return device.getBondState() == BluetoothDevice.BOND_BONDED
+ && (mShowConnectedDevice || (!device.isConnected()
+ && isDeviceInCachedDevicesList(cachedDevice)));
+ }
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
index 3fd5127..ef0f226 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.connecteddevice.audiosharing;
import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothCsipSetCoordinator;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeBroadcast;
import android.bluetooth.BluetoothLeBroadcastAssistant;
@@ -27,6 +28,7 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.DefaultLifecycleObserver;
@@ -43,6 +45,7 @@
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LeAudioProfile;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
@@ -68,9 +71,10 @@
"connected_device_audio_sharing_settings";
private final LocalBluetoothManager mLocalBtManager;
- private final LocalBluetoothLeBroadcast mBroadcast;
- private final LocalBluetoothLeBroadcastAssistant mAssistant;
private final Executor mExecutor;
+ private CachedBluetoothDeviceManager mDeviceManager;
+ private LocalBluetoothLeBroadcast mBroadcast;
+ private LocalBluetoothLeBroadcastAssistant mAssistant;
private PreferenceGroup mPreferenceGroup;
private Preference mAudioSharingSettingsPreference;
private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
@@ -165,6 +169,12 @@
+ ", reason = "
+ reason);
mBluetoothDeviceUpdater.forceUpdate();
+ if (mDeviceManager != null) {
+ CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(sink);
+ if (cachedDevice != null) {
+ closeOpeningDialogsForLeaDevice(cachedDevice);
+ }
+ }
}
@Override
@@ -241,8 +251,11 @@
public AudioSharingDevicePreferenceController(Context context) {
super(context, KEY);
mLocalBtManager = Utils.getLocalBtManager(mContext);
- mBroadcast = mLocalBtManager.getProfileManager().getLeAudioBroadcastProfile();
- mAssistant = mLocalBtManager.getProfileManager().getLeAudioBroadcastAssistantProfile();
+ if (mLocalBtManager != null) {
+ mDeviceManager = mLocalBtManager.getCachedDeviceManager();
+ mBroadcast = mLocalBtManager.getProfileManager().getLeAudioBroadcastProfile();
+ mAssistant = mLocalBtManager.getProfileManager().getLeAudioBroadcastAssistantProfile();
+ }
mExecutor = Executors.newSingleThreadExecutor();
}
@@ -344,6 +357,17 @@
@NonNull CachedBluetoothDevice cachedDevice,
@ConnectionState int state,
int bluetoothProfile) {
+ if (state == BluetoothAdapter.STATE_DISCONNECTED) {
+ boolean isLeAudio = isLeAudioSupported(cachedDevice);
+ if (isLeAudio && bluetoothProfile == BluetoothProfile.LE_AUDIO) {
+ closeOpeningDialogsForLeaDevice(cachedDevice);
+ return;
+ }
+ if (!isLeAudio && !cachedDevice.isConnected()) {
+ closeOpeningDialogsForNonLeaDevice(cachedDevice);
+ return;
+ }
+ }
if (state != BluetoothAdapter.STATE_CONNECTED || !cachedDevice.getDevice().isConnected()) {
Log.d(TAG, "Ignore onProfileConnectionStateChanged, not connected state");
return;
@@ -420,10 +444,10 @@
// connected during a sharing session.
postOnMainThread(
() -> {
- closeOpeningDialogs();
+ closeOpeningDialogsOtherThan(AudioSharingStopDialogFragment.tag());
AudioSharingStopDialogFragment.show(
mFragment,
- cachedDevice.getName(),
+ cachedDevice,
() -> mBroadcast.stopBroadcast(mBroadcast.getLatestBroadcastId()));
});
} else {
@@ -466,11 +490,12 @@
if (deviceItemsInSharingSession.size() >= 2) {
postOnMainThread(
() -> {
- closeOpeningDialogs();
+ closeOpeningDialogsOtherThan(
+ AudioSharingDisconnectDialogFragment.tag());
AudioSharingDisconnectDialogFragment.show(
mFragment,
deviceItemsInSharingSession,
- cachedDevice.getName(),
+ cachedDevice,
(AudioSharingDeviceItem item) -> {
// Remove all sources from the device user clicked
if (groupedDevices.containsKey(item.getGroupId())) {
@@ -497,11 +522,11 @@
// remote device connected during a sharing session.
postOnMainThread(
() -> {
- closeOpeningDialogs();
+ closeOpeningDialogsOtherThan(AudioSharingJoinDialogFragment.tag());
AudioSharingJoinDialogFragment.show(
mFragment,
deviceItemsInSharingSession,
- cachedDevice.getName(),
+ cachedDevice,
() -> {
// Add current broadcast to the latest connected device
mAssistant.addSource(
@@ -527,11 +552,11 @@
if (deviceItems.size() == 1) {
postOnMainThread(
() -> {
- closeOpeningDialogs();
+ closeOpeningDialogsOtherThan(AudioSharingJoinDialogFragment.tag());
AudioSharingJoinDialogFragment.show(
mFragment,
deviceItems,
- cachedDevice.getName(),
+ cachedDevice,
() -> {
mTargetSinks = new ArrayList<>();
for (List<CachedBluetoothDevice> devices :
@@ -591,17 +616,61 @@
}
}
- private void closeOpeningDialogs() {
+ private void closeOpeningDialogsOtherThan(String tag) {
if (mFragment == null) return;
List<Fragment> fragments = mFragment.getChildFragmentManager().getFragments();
for (Fragment fragment : fragments) {
- if (fragment instanceof DialogFragment) {
+ if (fragment instanceof DialogFragment && !fragment.getTag().equals(tag)) {
Log.d(TAG, "Remove staled opening dialog " + fragment.getTag());
((DialogFragment) fragment).dismiss();
}
}
}
+ private void closeOpeningDialogsForLeaDevice(@NonNull CachedBluetoothDevice cachedDevice) {
+ if (mFragment == null) return;
+ int groupId = AudioSharingUtils.getGroupId(cachedDevice);
+ List<Fragment> fragments = mFragment.getChildFragmentManager().getFragments();
+ for (Fragment fragment : fragments) {
+ CachedBluetoothDevice device = getCachedBluetoothDeviceFromDialog(fragment);
+ if (device != null
+ && groupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID
+ && AudioSharingUtils.getGroupId(device) == groupId) {
+ Log.d(TAG, "Remove staled opening dialog for group " + groupId);
+ ((DialogFragment) fragment).dismiss();
+ }
+ }
+ }
+
+ private void closeOpeningDialogsForNonLeaDevice(@NonNull CachedBluetoothDevice cachedDevice) {
+ if (mFragment == null) return;
+ String address = cachedDevice.getAddress();
+ List<Fragment> fragments = mFragment.getChildFragmentManager().getFragments();
+ for (Fragment fragment : fragments) {
+ CachedBluetoothDevice device = getCachedBluetoothDeviceFromDialog(fragment);
+ if (device != null && address != null && address.equals(device.getAddress())) {
+ Log.d(
+ TAG,
+ "Remove staled opening dialog for device "
+ + cachedDevice.getDevice().getAnonymizedAddress());
+ ((DialogFragment) fragment).dismiss();
+ }
+ }
+ }
+
+ @Nullable
+ private CachedBluetoothDevice getCachedBluetoothDeviceFromDialog(Fragment fragment) {
+ CachedBluetoothDevice device = null;
+ if (fragment instanceof AudioSharingJoinDialogFragment) {
+ device = ((AudioSharingJoinDialogFragment) fragment).getDevice();
+ } else if (fragment instanceof AudioSharingStopDialogFragment) {
+ device = ((AudioSharingStopDialogFragment) fragment).getDevice();
+ } else if (fragment instanceof AudioSharingDisconnectDialogFragment) {
+ device = ((AudioSharingDisconnectDialogFragment) fragment).getDevice();
+ }
+ return device;
+ }
+
private void postOnMainThread(@NonNull Runnable runnable) {
mContext.getMainExecutor().execute(runnable);
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java
index a2b1824..74c73aa 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java
@@ -19,13 +19,17 @@
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
@@ -33,8 +37,10 @@
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import java.util.ArrayList;
+import java.util.Locale;
public class AudioSharingDisconnectDialogFragment extends InstrumentedDialogFragment {
private static final String TAG = "AudioSharingDisconnectDialog";
@@ -56,6 +62,7 @@
}
private static DialogEventListener sListener;
+ @Nullable private static CachedBluetoothDevice sNewDevice;
@Override
public int getMetricsCategory() {
@@ -65,35 +72,78 @@
/**
* Display the {@link AudioSharingDisconnectDialogFragment} dialog.
*
+ * <p>If the dialog is showing for the same group, update the dialog event listener.
+ *
* @param host The Fragment this dialog will be hosted.
* @param deviceItems The existing connected device items in audio sharing session.
- * @param newDeviceName The name of the latest connected device triggered this dialog.
+ * @param newDevice The latest connected device triggered this dialog.
* @param listener The callback to handle the user action on this dialog.
*/
public static void show(
Fragment host,
ArrayList<AudioSharingDeviceItem> deviceItems,
- String newDeviceName,
+ CachedBluetoothDevice newDevice,
DialogEventListener listener) {
if (!AudioSharingUtils.isFeatureEnabled()) return;
final FragmentManager manager = host.getChildFragmentManager();
+ Fragment dialog = manager.findFragmentByTag(TAG);
+ if (dialog != null
+ && ((DialogFragment) dialog).getDialog() != null
+ && ((DialogFragment) dialog).getDialog().isShowing()) {
+ int newGroupId = AudioSharingUtils.getGroupId(newDevice);
+ if (sNewDevice != null && newGroupId == AudioSharingUtils.getGroupId(sNewDevice)) {
+ Log.d(
+ TAG,
+ String.format(
+ Locale.US,
+ "Dialog is showing for the same device group %d, "
+ + "update the content.",
+ newGroupId));
+ sListener = listener;
+ sNewDevice = newDevice;
+ return;
+ } else {
+ Log.d(
+ TAG,
+ String.format(
+ Locale.US,
+ "Dialog is showing for new device group %d, "
+ + "dismiss current dialog.",
+ newGroupId));
+ ((DialogFragment) dialog).dismiss();
+ }
+ }
sListener = listener;
+ sNewDevice = newDevice;
+ Log.d(TAG, "Show up the dialog.");
final Bundle bundle = new Bundle();
bundle.putParcelableArrayList(BUNDLE_KEY_DEVICE_TO_DISCONNECT_ITEMS, deviceItems);
- bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDeviceName);
- AudioSharingDisconnectDialogFragment dialog = new AudioSharingDisconnectDialogFragment();
- dialog.setArguments(bundle);
- dialog.show(manager, TAG);
+ bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
+ AudioSharingDisconnectDialogFragment dialogFrag =
+ new AudioSharingDisconnectDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
+ }
+
+ /** Return the tag of {@link AudioSharingDisconnectDialogFragment} dialog. */
+ public static @NonNull String tag() {
+ return TAG;
+ }
+
+ /** Get the latest connected device which triggers the dialog. */
+ public @Nullable CachedBluetoothDevice getDevice() {
+ return sNewDevice;
}
@Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Bundle arguments = requireArguments();
ArrayList<AudioSharingDeviceItem> deviceItems =
arguments.getParcelableArrayList(BUNDLE_KEY_DEVICE_TO_DISCONNECT_ITEMS);
final AlertDialog.Builder builder =
new AlertDialog.Builder(getActivity()).setCancelable(false);
LayoutInflater inflater = LayoutInflater.from(builder.getContext());
+ // Set custom title for the dialog.
View customTitle = inflater.inflate(R.layout.dialog_custom_title_audio_sharing, null);
ImageView icon = customTitle.findViewById(R.id.title_icon);
icon.setImageResource(R.drawable.ic_bt_audio_sharing);
@@ -115,10 +165,7 @@
recyclerView.setLayoutManager(
new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
Button cancelBtn = rootView.findViewById(R.id.cancel_btn);
- cancelBtn.setOnClickListener(
- v -> {
- dismiss();
- });
+ cancelBtn.setOnClickListener(v -> dismiss());
AlertDialog dialog = builder.setCustomTitle(customTitle).setView(rootView).create();
dialog.setCanceledOnTouchOutside(false);
return dialog;
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java
index f3f0fe4..8791c11 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java
@@ -18,19 +18,25 @@
import android.app.Dialog;
import android.app.settings.SettingsEnums;
+import android.graphics.Typeface;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import java.util.ArrayList;
import java.util.Locale;
@@ -49,6 +55,7 @@
}
private static DialogEventListener sListener;
+ private static @Nullable CachedBluetoothDevice sNewDevice;
@Override
public int getMetricsCategory() {
@@ -58,29 +65,54 @@
/**
* Display the {@link AudioSharingJoinDialogFragment} dialog.
*
+ * <p>If the dialog is showing, update the dialog message and event listener.
+ *
* @param host The Fragment this dialog will be hosted.
* @param deviceItems The existing connected device items eligible for audio sharing.
- * @param newDeviceName The name of the latest connected device triggered this dialog.
+ * @param newDevice The latest connected device triggered this dialog.
* @param listener The callback to handle the user action on this dialog.
*/
public static void show(
Fragment host,
ArrayList<AudioSharingDeviceItem> deviceItems,
- String newDeviceName,
+ CachedBluetoothDevice newDevice,
DialogEventListener listener) {
if (!AudioSharingUtils.isFeatureEnabled()) return;
final FragmentManager manager = host.getChildFragmentManager();
sListener = listener;
- final Bundle bundle = new Bundle();
- bundle.putParcelableArrayList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
- bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDeviceName);
- final AudioSharingJoinDialogFragment dialog = new AudioSharingJoinDialogFragment();
- dialog.setArguments(bundle);
- dialog.show(manager, TAG);
+ sNewDevice = newDevice;
+ Fragment dialog = manager.findFragmentByTag(TAG);
+ if (dialog != null
+ && ((DialogFragment) dialog).getDialog() != null
+ && ((DialogFragment) dialog).getDialog().isShowing()) {
+ Log.d(TAG, "Dialog is showing, update the content.");
+ updateDialog(
+ deviceItems,
+ newDevice.getName(),
+ (AlertDialog) ((DialogFragment) dialog).getDialog());
+ } else {
+ Log.d(TAG, "Show up the dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableArrayList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
+ bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
+ final AudioSharingJoinDialogFragment dialogFrag = new AudioSharingJoinDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
+ }
+ }
+
+ /** Return the tag of {@link AudioSharingJoinDialogFragment} dialog. */
+ public static @NonNull String tag() {
+ return TAG;
+ }
+
+ /** Get the latest connected device which triggers the dialog. */
+ public @Nullable CachedBluetoothDevice getDevice() {
+ return sNewDevice;
}
@Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Bundle arguments = requireArguments();
ArrayList<AudioSharingDeviceItem> deviceItems =
arguments.getParcelableArrayList(BUNDLE_KEY_DEVICE_ITEMS);
@@ -88,6 +120,7 @@
final AlertDialog.Builder builder =
new AlertDialog.Builder(getActivity()).setCancelable(false);
LayoutInflater inflater = LayoutInflater.from(builder.getContext());
+ // Set custom title for the dialog.
View customTitle =
inflater.inflate(R.layout.dialog_custom_title_audio_sharing, /* parent= */ null);
ImageView icon = customTitle.findViewById(R.id.title_icon);
@@ -95,21 +128,8 @@
TextView title = customTitle.findViewById(R.id.title_text);
title.setText("Share your audio");
View rootView = inflater.inflate(R.layout.dialog_audio_sharing_join, /* parent= */ null);
- TextView subtitle1 = rootView.findViewById(R.id.share_audio_subtitle1);
- TextView subtitle2 = rootView.findViewById(R.id.share_audio_subtitle2);
- if (deviceItems.isEmpty()) {
- subtitle1.setText(newDeviceName);
- } else {
- subtitle1.setText(
- String.format(
- Locale.US,
- "%s and %s",
- deviceItems.stream()
- .map(AudioSharingDeviceItem::getName)
- .collect(Collectors.joining(", ")),
- newDeviceName));
- }
- subtitle2.setText("This device's music and videos will play on both pairs of headphones");
+ TextView subtitle = rootView.findViewById(R.id.share_audio_subtitle);
+ subtitle.setText("This device's music and videos will play on both pairs of headphones");
Button shareBtn = rootView.findViewById(R.id.share_btn);
Button cancelBtn = rootView.findViewById(R.id.cancel_btn);
shareBtn.setOnClickListener(
@@ -119,8 +139,37 @@
});
shareBtn.setText("Share audio");
cancelBtn.setOnClickListener(v -> dismiss());
- Dialog dialog = builder.setCustomTitle(customTitle).setView(rootView).create();
+ AlertDialog dialog = builder.setCustomTitle(customTitle).setView(rootView).create();
dialog.setCanceledOnTouchOutside(false);
+ updateDialog(deviceItems, newDeviceName, dialog);
+ dialog.show();
+ TextView messageView = (TextView) dialog.findViewById(android.R.id.message);
+ if (messageView != null) {
+ Typeface typeface = Typeface.create(Typeface.DEFAULT_FAMILY, Typeface.NORMAL);
+ messageView.setTypeface(typeface);
+ messageView.setTextDirection(View.TEXT_DIRECTION_LOCALE);
+ messageView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
+ } else {
+ Log.w(TAG, "Fail to update message style: message view is null");
+ }
return dialog;
}
+
+ private static void updateDialog(
+ ArrayList<AudioSharingDeviceItem> deviceItems,
+ String newDeviceName,
+ @NonNull AlertDialog dialog) {
+ if (deviceItems.isEmpty()) {
+ dialog.setMessage(newDeviceName);
+ } else {
+ dialog.setMessage(
+ String.format(
+ Locale.US,
+ "%s and %s",
+ deviceItems.stream()
+ .map(AudioSharingDeviceItem::getName)
+ .collect(Collectors.joining(", ")),
+ newDeviceName));
+ }
+ }
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java
index 1454f76..3ba41f7 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java
@@ -18,18 +18,24 @@
import android.app.Dialog;
import android.app.settings.SettingsEnums;
+import android.graphics.Typeface;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
public class AudioSharingStopDialogFragment extends InstrumentedDialogFragment {
private static final String TAG = "AudioSharingStopDialog";
@@ -44,6 +50,7 @@
}
private static DialogEventListener sListener;
+ private static @Nullable CachedBluetoothDevice sNewDevice;
@Override
public int getMetricsCategory() {
@@ -53,41 +60,79 @@
/**
* Display the {@link AudioSharingStopDialogFragment} dialog.
*
+ * <p>If the dialog is showing, update the dialog message and event listener.
+ *
* @param host The Fragment this dialog will be hosted.
- * @param newDeviceName The name of the latest connected device triggered this dialog.
+ * @param newDevice The latest connected device triggered this dialog.
* @param listener The callback to handle the user action on this dialog.
*/
- public static void show(Fragment host, String newDeviceName, DialogEventListener listener) {
+ public static void show(
+ Fragment host, CachedBluetoothDevice newDevice, DialogEventListener listener) {
if (!AudioSharingUtils.isFeatureEnabled()) return;
final FragmentManager manager = host.getChildFragmentManager();
sListener = listener;
- final Bundle bundle = new Bundle();
- bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDeviceName);
- AudioSharingStopDialogFragment dialog = new AudioSharingStopDialogFragment();
- dialog.setArguments(bundle);
- dialog.show(manager, TAG);
+ sNewDevice = newDevice;
+ Fragment dialog = manager.findFragmentByTag(TAG);
+ if (dialog != null
+ && ((DialogFragment) dialog).getDialog() != null
+ && ((DialogFragment) dialog).getDialog().isShowing()) {
+ Log.d(TAG, "Dialog is showing, update the content.");
+ updateDialog(newDevice.getName(), (AlertDialog) ((DialogFragment) dialog).getDialog());
+ } else {
+ Log.d(TAG, "Show up the dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
+ AudioSharingStopDialogFragment dialogFrag = new AudioSharingStopDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
+ }
+ }
+
+ /** Return the tag of {@link AudioSharingStopDialogFragment} dialog. */
+ public static @NonNull String tag() {
+ return TAG;
+ }
+
+ /** Get the latest connected device which triggers the dialog. */
+ public @Nullable CachedBluetoothDevice getDevice() {
+ return sNewDevice;
}
@Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Bundle arguments = requireArguments();
String newDeviceName = arguments.getString(BUNDLE_KEY_NEW_DEVICE_NAME);
final AlertDialog.Builder builder =
new AlertDialog.Builder(getActivity()).setCancelable(false);
LayoutInflater inflater = LayoutInflater.from(builder.getContext());
+ // Set custom title for the dialog.
View customTitle =
inflater.inflate(R.layout.dialog_custom_title_audio_sharing, /* parent= */ null);
ImageView icon = customTitle.findViewById(R.id.title_icon);
icon.setImageResource(R.drawable.ic_warning_24dp);
TextView title = customTitle.findViewById(R.id.title_text);
title.setText("Stop sharing audio?");
- builder.setMessage(
- newDeviceName + " wants to connect, headphones in audio sharing will disconnect.");
builder.setPositiveButton(
"Stop sharing", (dialog, which) -> sListener.onStopSharingClick());
builder.setNegativeButton("Cancel", (dialog, which) -> dismiss());
AlertDialog dialog = builder.setCustomTitle(customTitle).create();
dialog.setCanceledOnTouchOutside(false);
+ updateDialog(newDeviceName, dialog);
+ dialog.show();
+ TextView messageView = (TextView) dialog.findViewById(android.R.id.message);
+ if (messageView != null) {
+ Typeface typeface = Typeface.create(Typeface.DEFAULT_FAMILY, Typeface.NORMAL);
+ messageView.setTypeface(typeface);
+ messageView.setTextDirection(View.TEXT_DIRECTION_LOCALE);
+ messageView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
+ } else {
+ Log.w(TAG, "sssFail to update dialog: message view is null");
+ }
return dialog;
}
+
+ private static void updateDialog(String newDeviceName, @NonNull AlertDialog dialog) {
+ dialog.setMessage(
+ newDeviceName + " wants to connect, headphones in audio sharing will disconnect.");
+ }
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingUtils.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingUtils.java
index 242ce20..f489e9c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingUtils.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingUtils.java
@@ -22,9 +22,12 @@
import android.bluetooth.BluetoothLeBroadcastReceiveState;
import android.bluetooth.BluetoothStatusCodes;
import android.content.Context;
+import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
+import androidx.annotation.NonNull;
+
import com.android.settings.flags.Flags;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -113,20 +116,7 @@
boolean filterByInSharing) {
List<CachedBluetoothDevice> orderedDevices = new ArrayList<>();
for (List<CachedBluetoothDevice> devices : groupedConnectedDevices.values()) {
- CachedBluetoothDevice leadDevice = null;
- for (CachedBluetoothDevice device : devices) {
- if (!device.getMemberDevice().isEmpty()) {
- leadDevice = device;
- break;
- }
- }
- if (leadDevice == null && !devices.isEmpty()) {
- leadDevice = devices.get(0);
- Log.d(
- TAG,
- "Empty member device, pick arbitrary device as the lead: "
- + leadDevice.getDevice().getAnonymizedAddress());
- }
+ @Nullable CachedBluetoothDevice leadDevice = getLeadDevice(devices);
if (leadDevice == null) {
Log.d(TAG, "Skip due to no lead device");
continue;
@@ -167,6 +157,29 @@
}
/**
+ * Get the lead device from a list of devices with same group id.
+ *
+ * @param devices A list of devices with same group id.
+ * @return The lead device
+ */
+ @Nullable
+ public static CachedBluetoothDevice getLeadDevice(
+ @NonNull List<CachedBluetoothDevice> devices) {
+ if (devices.isEmpty()) return null;
+ for (CachedBluetoothDevice device : devices) {
+ if (!device.getMemberDevice().isEmpty()) {
+ return device;
+ }
+ }
+ CachedBluetoothDevice leadDevice = devices.get(0);
+ Log.d(
+ TAG,
+ "No lead device in the group, pick arbitrary device as the lead: "
+ + leadDevice.getDevice().getAnonymizedAddress());
+ return leadDevice;
+ }
+
+ /**
* Fetch a list of ordered connected lead {@link AudioSharingDeviceItem}s eligible for audio
* sharing. The active device is placed in the first place if it exists. The devices can be
* filtered by whether it is already in the audio sharing session.
@@ -268,7 +281,7 @@
var groupedDevices = fetchConnectedDevicesByGroupId(manager);
var leadDevices = buildOrderedConnectedLeadDevices(manager, groupedDevices, false);
- if (!leadDevices.isEmpty() && AudioSharingUtils.isActiveLeAudioDevice(leadDevices.get(0))) {
+ if (!leadDevices.isEmpty() && isActiveLeAudioDevice(leadDevices.get(0))) {
return Optional.of(leadDevices.get(0));
} else {
Log.w(TAG, "getActiveSinksOnAssistant(): No active lead device!");
@@ -379,4 +392,17 @@
Log.d(TAG, "getGroupId return invalid id for device: " + anonymizedAddress);
return BluetoothCsipSetCoordinator.GROUP_ID_INVALID;
}
+
+ /** Get the fallback active group id from SettingsProvider. */
+ public static int getFallbackActiveGroupId(@NonNull Context context) {
+ return Settings.Secure.getInt(
+ context.getContentResolver(),
+ "bluetooth_le_broadcast_fallback_active_group_id",
+ BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ }
+
+ /** Post the runnable to main thread. */
+ public static void postOnMainThread(@NonNull Context context, @NonNull Runnable runnable) {
+ context.getMainExecutor().execute(runnable);
+ }
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragment.java
index e47e141..9d346d3 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragment.java
@@ -81,8 +81,12 @@
ArrayList<AudioSharingDeviceItem> deviceItems =
arguments.getParcelableArrayList(BUNDLE_KEY_DEVICE_ITEMS);
int checkedItem = -1;
- // deviceItems is ordered. The active device is put in the first place if it does exist
- if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) checkedItem = 0;
+ for (AudioSharingDeviceItem item : deviceItems) {
+ int fallbackActiveGroupId = AudioSharingUtils.getFallbackActiveGroupId(getContext());
+ if (item.getGroupId() == fallbackActiveGroupId) {
+ checkedItem = deviceItems.indexOf(item);
+ }
+ }
String[] choices =
deviceItems.stream().map(AudioSharingDeviceItem::getName).toArray(String[]::new);
AlertDialog.Builder builder =
diff --git a/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceController.java
index 1a2d52b..2a538d5 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceController.java
@@ -16,6 +16,12 @@
package com.android.settings.connecteddevice.audiosharing;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothCsipSetCoordinator;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothLeBroadcastAssistant;
+import android.bluetooth.BluetoothLeBroadcastMetadata;
+import android.bluetooth.BluetoothLeBroadcastReceiveState;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.util.Log;
@@ -29,6 +35,7 @@
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.utils.ThreadUtils;
@@ -36,6 +43,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
/** PreferenceController to control the dialog to choose the active device for calls and alarms */
public class CallsAndAlarmsPreferenceController extends AudioSharingBasePreferenceController
@@ -45,13 +54,74 @@
private static final String PREF_KEY = "calls_and_alarms";
private final LocalBluetoothManager mLocalBtManager;
+ private final Executor mExecutor;
+ @Nullable private LocalBluetoothLeBroadcastAssistant mAssistant = null;
private DashboardFragment mFragment;
Map<Integer, List<CachedBluetoothDevice>> mGroupedConnectedDevices = new HashMap<>();
private ArrayList<AudioSharingDeviceItem> mDeviceItemsInSharingSession = new ArrayList<>();
+ private BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback =
+ new BluetoothLeBroadcastAssistant.Callback() {
+ @Override
+ public void onSearchStarted(int reason) {}
+
+ @Override
+ public void onSearchStartFailed(int reason) {}
+
+ @Override
+ public void onSearchStopped(int reason) {}
+
+ @Override
+ public void onSearchStopFailed(int reason) {}
+
+ @Override
+ public void onSourceFound(@NonNull BluetoothLeBroadcastMetadata source) {}
+
+ @Override
+ public void onSourceAdded(@NonNull BluetoothDevice sink, int sourceId, int reason) {
+ Log.d(TAG, "onSourceAdded");
+ updatePreference();
+ }
+
+ @Override
+ public void onSourceAddFailed(
+ @NonNull BluetoothDevice sink,
+ @NonNull BluetoothLeBroadcastMetadata source,
+ int reason) {}
+
+ @Override
+ public void onSourceModified(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onSourceModifyFailed(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onSourceRemoved(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {
+ Log.d(TAG, "onSourceRemoved");
+ updatePreference();
+ }
+
+ @Override
+ public void onSourceRemoveFailed(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onReceiveStateChanged(
+ BluetoothDevice sink,
+ int sourceId,
+ BluetoothLeBroadcastReceiveState state) {}
+ };
+
public CallsAndAlarmsPreferenceController(Context context) {
super(context, PREF_KEY);
mLocalBtManager = Utils.getLocalBtManager(mContext);
+ if (mLocalBtManager != null) {
+ mAssistant = mLocalBtManager.getProfileManager().getLeAudioBroadcastAssistantProfile();
+ }
+ mExecutor = Executors.newSingleThreadExecutor();
}
@Override
@@ -60,7 +130,7 @@
}
@Override
- public void displayPreference(PreferenceScreen screen) {
+ public void displayPreference(@NonNull PreferenceScreen screen) {
super.displayPreference(screen);
mPreference.setOnPreferenceClickListener(
preference -> {
@@ -69,14 +139,31 @@
return true;
}
updateDeviceItemsInSharingSession();
- if (mDeviceItemsInSharingSession.size() >= 2) {
+ if (mDeviceItemsInSharingSession.size() >= 1) {
CallsAndAlarmsDialogFragment.show(
mFragment,
mDeviceItemsInSharingSession,
(AudioSharingDeviceItem item) -> {
- for (CachedBluetoothDevice device :
- mGroupedConnectedDevices.get(item.getGroupId())) {
- device.setActive();
+ if (!mGroupedConnectedDevices.containsKey(item.getGroupId())) {
+ return;
+ }
+ List<CachedBluetoothDevice> devices =
+ mGroupedConnectedDevices.get(item.getGroupId());
+ @Nullable
+ CachedBluetoothDevice lead =
+ AudioSharingUtils.getLeadDevice(devices);
+ if (lead != null) {
+ Log.d(
+ TAG,
+ "Set fallback active device: "
+ + lead.getDevice().getAnonymizedAddress());
+ lead.setActive();
+ updatePreference();
+ } else {
+ Log.w(
+ TAG,
+ "Fail to set fallback active device: no lead"
+ + " device");
}
});
}
@@ -90,6 +177,9 @@
if (mLocalBtManager != null) {
mLocalBtManager.getEventManager().registerCallback(this);
}
+ if (mAssistant != null) {
+ mAssistant.registerServiceCallBack(mExecutor, mBroadcastAssistantCallback);
+ }
}
@Override
@@ -98,52 +188,58 @@
if (mLocalBtManager != null) {
mLocalBtManager.getEventManager().unregisterCallback(this);
}
+ if (mAssistant != null) {
+ mAssistant.unregisterServiceCallBack(mBroadcastAssistantCallback);
+ }
}
@Override
public void updateVisibility() {
if (mPreference == null) return;
- var unused =
- ThreadUtils.postOnBackgroundThread(
- () -> {
- boolean isVisible = isBroadcasting() && isBluetoothStateOn();
- if (!isVisible) {
- ThreadUtils.postOnMainThread(() -> mPreference.setVisible(false));
- } else {
- updateDeviceItemsInSharingSession();
- // mDeviceItemsInSharingSession is ordered. The active device is the
- // first
- // place if exits.
- if (!mDeviceItemsInSharingSession.isEmpty()
- && mDeviceItemsInSharingSession.get(0).isActive()) {
- ThreadUtils.postOnMainThread(
- () -> {
- mPreference.setVisible(true);
- mPreference.setSummary(
- mDeviceItemsInSharingSession
- .get(0)
- .getName());
- });
- } else {
- ThreadUtils.postOnMainThread(
- () -> {
- mPreference.setVisible(true);
- mPreference.setSummary(
- "No active device in sharing");
- });
- }
- }
- });
+ var unused = ThreadUtils.postOnBackgroundThread(() -> updatePreference());
+ }
+
+ private void updatePreference() {
+ boolean isVisible = isBroadcasting() && isBluetoothStateOn();
+ if (!isVisible) {
+ AudioSharingUtils.postOnMainThread(mContext, () -> mPreference.setVisible(false));
+ return;
+ }
+ updateDeviceItemsInSharingSession();
+ int fallbackActiveGroupId = AudioSharingUtils.getFallbackActiveGroupId(mContext);
+ Log.d(TAG, "updatePreference: get fallback active group " + fallbackActiveGroupId);
+ if (fallbackActiveGroupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+ for (AudioSharingDeviceItem item : mDeviceItemsInSharingSession) {
+ if (item.getGroupId() == fallbackActiveGroupId) {
+ AudioSharingUtils.postOnMainThread(
+ mContext,
+ () -> {
+ mPreference.setSummary(item.getName());
+ mPreference.setVisible(true);
+ });
+ return;
+ }
+ }
+ }
+ AudioSharingUtils.postOnMainThread(
+ mContext,
+ () -> {
+ mPreference.setSummary("No active device in sharing");
+ mPreference.setVisible(true);
+ });
}
@Override
- public void onActiveDeviceChanged(
- @Nullable CachedBluetoothDevice activeDevice, int bluetoothProfile) {
- if (bluetoothProfile != BluetoothProfile.LE_AUDIO) {
- Log.d(TAG, "Ignore onActiveDeviceChanged, not LE_AUDIO profile");
- return;
+ public void onProfileConnectionStateChanged(
+ @NonNull CachedBluetoothDevice cachedDevice,
+ @ConnectionState int state,
+ int bluetoothProfile) {
+ if (state == BluetoothAdapter.STATE_DISCONNECTED
+ && bluetoothProfile == BluetoothProfile.LE_AUDIO) {
+ // The fallback active device could be updated if the previous fallback device is
+ // disconnected.
+ updatePreference();
}
- mPreference.setSummary(activeDevice == null ? "" : activeDevice.getName());
}
/**
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 8fee052..e3131f7 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -34,6 +34,7 @@
import com.android.settings.accessibility.ToggleColorInversionPreferenceFragment;
import com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment;
import com.android.settings.accessibility.ToggleReduceBrightColorsPreferenceFragment;
+import com.android.settings.accessibility.VibrationIntensitySettingsFragment;
import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment;
import com.android.settings.accounts.AccountDashboardFragment;
import com.android.settings.accounts.AccountSyncSettings;
@@ -169,6 +170,8 @@
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.privacy.PrivacyControlsFragment;
import com.android.settings.privacy.PrivacyDashboardFragment;
+import com.android.settings.privatespace.delete.PrivateSpaceDeleteFragment;
+import com.android.settings.privatespace.delete.PrivateSpaceDeletionProgressFragment;
import com.android.settings.privatespace.onelock.PrivateSpaceBiometricSettings;
import com.android.settings.regionalpreferences.RegionalPreferencesEntriesFragment;
import com.android.settings.safetycenter.MoreSecurityPrivacyFragment;
@@ -271,6 +274,8 @@
CombinedBiometricSettings.class.getName(),
CombinedBiometricProfileSettings.class.getName(),
PrivateSpaceBiometricSettings.class.getName(),
+ PrivateSpaceDeleteFragment.class.getName(),
+ PrivateSpaceDeletionProgressFragment.class.getName(),
SwipeToNotificationSettings.class.getName(),
DoubleTapPowerSettings.class.getName(),
DoubleTapScreenSettings.class.getName(),
@@ -382,6 +387,7 @@
UserAspectRatioDetails.class.getName(),
ScreenTimeoutSettings.class.getName(),
ResetNetwork.class.getName(),
+ VibrationIntensitySettingsFragment.class.getName(),
};
public static final String[] SETTINGS_FOR_RESTRICTED = {
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 504eda8..6b38b28 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -763,6 +763,7 @@
context, context.getSystemService(UiModeManager.class)));
controllers.add(new ForceEnableNotesRolePreferenceController(context));
controllers.add(new GrammaticalGenderPreferenceController(context));
+ controllers.add(new SensitiveContentProtectionPreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/development/Enable16kPagesPreferenceController.java b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
index 37357fe..3f9da57 100644
--- a/src/com/android/settings/development/Enable16kPagesPreferenceController.java
+++ b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
@@ -176,6 +176,7 @@
public void on16kPagesDialogDismissed() {}
private void installUpdate() {
+ // Check if there is any pending system update
SystemUpdateManager manager = mContext.getSystemService(SystemUpdateManager.class);
Bundle data = manager.retrieveSystemUpdateInfo();
int status = data.getInt(SystemUpdateManager.KEY_STATUS);
@@ -184,6 +185,10 @@
throw new RuntimeException("System has pending update!");
}
+ // Publish system update info
+ PersistableBundle info = createUpdateInfo(SystemUpdateManager.STATUS_IN_PROGRESS);
+ manager.updateSystemUpdateInfo(info);
+
String updateFilePath = mEnable16k ? OTA_16K_PATH : OTA_4K_PATH;
try {
File updateFile = new File(updateFilePath);
@@ -315,10 +320,10 @@
mEnable16k ? ENABLE_16K_PAGE_SIZE : ENABLE_4K_PAGE_SIZE);
// Publish system update info
- SystemUpdateManager manager =
- (SystemUpdateManager)
- mContext.getSystemService(Context.SYSTEM_UPDATE_SERVICE);
- manager.updateSystemUpdateInfo(getUpdateInfo());
+ SystemUpdateManager manager = mContext.getSystemService(SystemUpdateManager.class);
+ PersistableBundle info =
+ createUpdateInfo(SystemUpdateManager.STATUS_WAITING_REBOOT);
+ manager.updateSystemUpdateInfo(info);
// Restart device to complete update
PowerManager pm = mContext.getSystemService(PowerManager.class);
@@ -345,10 +350,9 @@
return builder.create();
}
- private PersistableBundle getUpdateInfo() {
+ private PersistableBundle createUpdateInfo(int status) {
PersistableBundle infoBundle = new PersistableBundle();
- infoBundle.putInt(
- SystemUpdateManager.KEY_STATUS, SystemUpdateManager.STATUS_WAITING_REBOOT);
+ infoBundle.putInt(SystemUpdateManager.KEY_STATUS, status);
infoBundle.putBoolean(SystemUpdateManager.KEY_IS_SECURITY_UPDATE, false);
infoBundle.putString(SystemUpdateManager.KEY_TITLE, EXPERIMENTAL_UPDATE_TITLE);
return infoBundle;
diff --git a/src/com/android/settings/development/OWNERS b/src/com/android/settings/development/OWNERS
index 09a4914..92c8cfa 100644
--- a/src/com/android/settings/development/OWNERS
+++ b/src/com/android/settings/development/OWNERS
@@ -1,6 +1,9 @@
# GameDefaultFrameRatePreferenceController
per-file GameDefaultFrameRatePreferenceController.java=file:platform/frameworks/base:/GAME_MANAGER_OWNERS
+# SensitiveContentProtectionPreferenceController
+per-file SensitiveContentProtectionPreferenceController.kt=file:platform/frameworks/base:/core/java/android/permission/OWNERS
+
# ShowHdrSdrRatioPreferenceController
per-file ShowHdrSdrRatioPreferenceController.java=file:platform/frameworks/native:/services/surfaceflinger/OWNERS
diff --git a/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt b/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
new file mode 100644
index 0000000..6fe56c8
--- /dev/null
+++ b/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
@@ -0,0 +1,79 @@
+/*
+ * 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 androidx.annotation.VisibleForTesting
+import androidx.preference.Preference
+import androidx.preference.TwoStatePreference
+import com.android.server.notification.Flags.sensitiveNotificationAppProtection
+import com.android.server.notification.Flags.screenshareNotificationHiding
+import com.android.settings.core.PreferenceControllerMixin
+import com.android.settingslib.development.DeveloperOptionsPreferenceController
+
+class SensitiveContentProtectionPreferenceController(val context: Context) :
+ DeveloperOptionsPreferenceController(context),
+ Preference.OnPreferenceChangeListener,
+ PreferenceControllerMixin {
+
+ override fun getPreferenceKey(): String =
+ DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS_KEY
+
+ override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
+ val isEnabled = newValue as Boolean
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ if (isEnabled) SETTING_VALUE_ON else SETTING_VALUE_OFF
+ )
+ return true
+ }
+
+ override fun updateState(preference: Preference?) {
+ val mode = Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ 0)
+ (mPreference as TwoStatePreference).isChecked = mode != SETTING_VALUE_OFF
+ }
+
+ // Overriding as public, kotlin tests can not invoke a protected method
+ public override fun onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled()
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ SETTING_VALUE_OFF
+ )
+ (mPreference as TwoStatePreference).isChecked = false
+ }
+
+ override fun isAvailable(): Boolean {
+ return sensitiveNotificationAppProtection() || screenshareNotificationHiding()
+ }
+
+ companion object {
+ private const val DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS_KEY =
+ "disable_screen_share_protections_for_apps_and_notifications"
+
+ @VisibleForTesting
+ val SETTING_VALUE_ON = 1
+
+ @VisibleForTesting
+ val SETTING_VALUE_OFF = 0
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java
index d1bf808..8e583fd 100644
--- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java
@@ -56,28 +56,6 @@
}
@Override
- public CharSequence getSummary() {
- return mContext.getString(R.string.device_info_protected_single_press);
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- String prefKey = preference.getKey();
- if (prefKey.startsWith(KEY_PHONE_NUMBER)) {
- int simSlotNumber = 0;
- if (!TextUtils.equals(prefKey, KEY_PHONE_NUMBER)) {
- // Get multisim slot number from preference key.
- // Multisim preference key is KEY_PHONE_NUMBER + simSlotNumber
- simSlotNumber = Integer.parseInt(
- prefKey.replaceAll("[^0-9]", ""));
- }
- final Preference simStatusPreference = mPreferenceList.get(simSlotNumber);
- simStatusPreference.setSummary(getPhoneNumber(simSlotNumber));
- }
- return super.handlePreferenceTreeClick(preference);
- }
-
- @Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
if (!SubscriptionUtil.isSimHardwareVisible(mContext)) {
@@ -105,7 +83,7 @@
for (int simSlotNumber = 0; simSlotNumber < mPreferenceList.size(); simSlotNumber++) {
final Preference simStatusPreference = mPreferenceList.get(simSlotNumber);
simStatusPreference.setTitle(getPreferenceTitle(simSlotNumber));
- simStatusPreference.setSummary(getSummary());
+ simStatusPreference.setSummary(getPhoneNumber(simSlotNumber));
}
}
@@ -155,7 +133,7 @@
}
@VisibleForTesting
- protected CharSequence getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo) {
+ protected String getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo) {
final String phoneNumber = SubscriptionUtil.getBidiFormattedPhoneNumber(mContext,
subscriptionInfo);
return TextUtils.isEmpty(phoneNumber) ? mContext.getString(R.string.device_info_default)
@@ -164,6 +142,6 @@
@VisibleForTesting
protected Preference createNewPreference(Context context) {
- return new PhoneNumberSummaryPreference(context);
+ return new Preference(context);
}
}
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
index 2045b96..ff55184 100644
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
@@ -33,7 +33,6 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.deviceinfo.PhoneNumberSummaryPreference;
import com.android.settings.deviceinfo.simstatus.SlotSimStatus;
import com.android.settings.network.SubscriptionUtil;
import com.android.settingslib.Utils;
@@ -103,6 +102,7 @@
multiImeiPreference.setKey(DEFAULT_KEY + (1 + simSlotNumber));
multiImeiPreference.setEnabled(true);
multiImeiPreference.setCopyingEnabled(true);
+
category.addPreference(multiImeiPreference);
}
}
@@ -112,11 +112,6 @@
updatePreference(preference, keyToSlotIndex(preference.getKey()));
}
- @Override
- public CharSequence getSummary() {
- return mContext.getString(R.string.device_info_protected_single_press);
- }
-
private CharSequence getSummary(int simSlot) {
final int phoneType = getPhoneType(simSlot);
return phoneType == PHONE_TYPE_CDMA ? mTelephonyManager.getMeid(simSlot)
@@ -150,8 +145,12 @@
@VisibleForTesting
protected void updatePreference(Preference preference, int simSlot) {
+ if (simSlot < 0) {
+ preference.setVisible(false);
+ return;
+ }
preference.setTitle(getTitle(simSlot));
- preference.setSummary(getSummary());
+ preference.setSummary(getSummary(simSlot));
}
private CharSequence getTitleForGsmPhone(int simSlot, boolean isPrimaryImei) {
@@ -195,6 +194,6 @@
@VisibleForTesting
Preference createNewPreference(Context context) {
- return new PhoneNumberSummaryPreference(context);
+ return new Preference(context);
}
}
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.kt b/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.kt
index e0376dc..f765d8c 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.kt
+++ b/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.kt
@@ -92,6 +92,7 @@
}
preference.title = title
preference.dialogTitle = title
+ preference.summary = eid
updateDialog()
}
}
@@ -130,9 +131,6 @@
val qrCodeView = dialog.requireViewById<ImageView>(R.id.esim_id_qrcode)
qrCodeView.setImageBitmap(getEidQrCode(eid))
-
- // After "Tap to show", eid is displayed on preference.
- preference.summary = textView.text
}
override fun handlePreferenceTreeClick(preference: Preference): Boolean {
diff --git a/src/com/android/settings/display/FoldLockBehaviorSettings.java b/src/com/android/settings/display/FoldLockBehaviorSettings.java
index 432c230..889a7dd 100644
--- a/src/com/android/settings/display/FoldLockBehaviorSettings.java
+++ b/src/com/android/settings/display/FoldLockBehaviorSettings.java
@@ -160,8 +160,13 @@
IllustrationType.LOTTIE_ANIMATION);
break;
case SETTING_VALUE_SELECTIVE_STAY_AWAKE:
- setIllustration(R.raw.fold_setting_selective_stay_awake_lottie,
- IllustrationType.LOTTIE_ANIMATION);
+ if (mFoldGracePeriodProvider.isEnabled()) {
+ setIllustration(R.raw.fold_setting_grace_period_selective_stay_awake_lottie,
+ IllustrationType.LOTTIE_ANIMATION);
+ } else {
+ setIllustration(R.raw.fold_setting_selective_stay_awake_lottie,
+ IllustrationType.LOTTIE_ANIMATION);
+ }
break;
case SETTING_VALUE_SLEEP_ON_FOLD:
setIllustration(R.raw.fold_setting_sleep_on_fold_lottie,
diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java
index cc333a5..62be5df 100644
--- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java
@@ -18,6 +18,7 @@
import android.content.Context;
+import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import java.util.List;
@@ -35,5 +36,9 @@
boolean isBatteryInfoEnabled(Context context);
/** A way to add more battery tip detectors. */
- void addBatteryTipDetector(Context context, List<BatteryTip> tips, BatteryInfo batteryInfo);
+ void addBatteryTipDetector(
+ Context context,
+ List<BatteryTip> batteryTips,
+ BatteryInfo batteryInfo,
+ BatteryTipPolicy batteryTipPolicy);
}
diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java
index f974b9d..f398373 100644
--- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java
@@ -18,6 +18,8 @@
import android.content.Context;
+import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
+import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import java.util.List;
@@ -42,5 +44,10 @@
@Override
public void addBatteryTipDetector(
- Context context, List<BatteryTip> tips, BatteryInfo batteryInfo) {}
+ Context context,
+ List<BatteryTip> batteryTips,
+ BatteryInfo batteryInfo,
+ BatteryTipPolicy batteryTipPolicy) {
+ batteryTips.add(new LowBatteryDetector(context, batteryTipPolicy, batteryInfo).detect());
+ }
}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java
index 45c1be0..6425833 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java
@@ -41,7 +41,7 @@
public class BatterySaverScheduleRadioButtonsController {
private static final String TAG = "BatterySaverScheduleRadioButtonsController";
- public static final int TRIGGER_LEVEL_MIN = 10;
+ public static final int TRIGGER_LEVEL_MIN = 20;
private Context mContext;
private BatterySaverScheduleSeekBarController mSeekBarController;
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
index 5352105..d68bf39 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.os.BatteryUsageStats;
-import android.os.PowerManager;
import androidx.annotation.VisibleForTesting;
@@ -27,7 +26,6 @@
import com.android.settings.fuelgauge.batterytip.detectors.BatteryDefenderDetector;
import com.android.settings.fuelgauge.batterytip.detectors.HighUsageDetector;
import com.android.settings.fuelgauge.batterytip.detectors.IncompatibleChargerDetector;
-import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.utils.AsyncLoaderCompat;
@@ -56,19 +54,18 @@
@Override
public List<BatteryTip> loadInBackground() {
final List<BatteryTip> tips = new ArrayList<>();
- final BatteryTipPolicy policy = new BatteryTipPolicy(getContext());
+ final BatteryTipPolicy batteryTipPolicy = new BatteryTipPolicy(getContext());
final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG);
final Context context = getContext().getApplicationContext();
- final boolean isPowerSaveMode =
- context.getSystemService(PowerManager.class).isPowerSaveMode();
- tips.add(new LowBatteryDetector(context, policy, batteryInfo, isPowerSaveMode).detect());
- tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect());
+ tips.add(
+ new HighUsageDetector(context, batteryTipPolicy, mBatteryUsageStats, batteryInfo)
+ .detect());
tips.add(new BatteryDefenderDetector(batteryInfo, context).detect());
tips.add(new IncompatibleChargerDetector(context).detect());
FeatureFactory.getFeatureFactory()
.getBatterySettingsFeatureProvider()
- .addBatteryTipDetector(context, tips, batteryInfo);
+ .addBatteryTipDetector(context, tips, batteryInfo, batteryTipPolicy);
Collections.sort(tips);
return tips;
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java
index 1ce5a8e..b1a1562 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java
@@ -17,6 +17,7 @@
package com.android.settings.fuelgauge.batterytip.detectors;
import android.content.Context;
+import android.os.PowerManager;
import com.android.settings.fuelgauge.BatteryInfo;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
@@ -26,37 +27,33 @@
/** Detect whether the battery is too low */
public class LowBatteryDetector implements BatteryTipDetector {
private final BatteryInfo mBatteryInfo;
- private final BatteryTipPolicy mPolicy;
+ private final BatteryTipPolicy mBatteryTipPolicy;
private final boolean mIsPowerSaveMode;
private final int mWarningLevel;
public LowBatteryDetector(
- Context context,
- BatteryTipPolicy policy,
- BatteryInfo batteryInfo,
- boolean isPowerSaveMode) {
- mPolicy = policy;
+ Context context, BatteryTipPolicy batteryTipPolicy, BatteryInfo batteryInfo) {
+ mBatteryTipPolicy = batteryTipPolicy;
mBatteryInfo = batteryInfo;
mWarningLevel =
context.getResources()
.getInteger(com.android.internal.R.integer.config_lowBatteryWarningLevel);
- mIsPowerSaveMode = isPowerSaveMode;
+ mIsPowerSaveMode = context.getSystemService(PowerManager.class).isPowerSaveMode();
}
@Override
public BatteryTip detect() {
final boolean lowBattery = mBatteryInfo.batteryLevel <= mWarningLevel;
- final boolean lowBatteryEnabled = mPolicy.lowBatteryEnabled && !mIsPowerSaveMode;
+ final boolean lowBatteryEnabled = mBatteryTipPolicy.lowBatteryEnabled && !mIsPowerSaveMode;
final boolean dischargingLowBatteryState =
- mPolicy.testLowBatteryTip || (mBatteryInfo.discharging && lowBattery);
-
- int state = BatteryTip.StateType.INVISIBLE;
+ mBatteryTipPolicy.testLowBatteryTip || (mBatteryInfo.discharging && lowBattery);
// Show it as new if in test or in discharging low battery state,
// dismiss it if battery saver is on or disabled by config.
- if (lowBatteryEnabled && dischargingLowBatteryState) {
- state = BatteryTip.StateType.NEW;
- }
+ final int state =
+ lowBatteryEnabled && dischargingLowBatteryState
+ ? BatteryTip.StateType.NEW
+ : BatteryTip.StateType.INVISIBLE;
return new LowBatteryTip(state, mIsPowerSaveMode);
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
index 047bf13..319ba7a 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
@@ -16,12 +16,14 @@
package com.android.settings.fuelgauge.batterytip.tips;
+import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.os.Parcel;
import android.util.Log;
+import androidx.core.app.ActivityCompat;
import androidx.preference.Preference;
import com.android.settings.R;
@@ -30,6 +32,8 @@
import com.android.settingslib.HelpUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import kotlin.Unit;
+
/** Tip to show current battery is overheated */
public class BatteryDefenderTip extends BatteryTip {
@@ -83,28 +87,39 @@
}
cardPreference.setSelectable(false);
+ cardPreference.setIconResId(getIconId());
cardPreference.setPrimaryButtonText(context.getString(R.string.learn_more));
- cardPreference.setPrimaryButtonClickListener(
- button ->
- button.startActivityForResult(
- HelpUtils.getHelpIntent(
- context,
- context.getString(R.string.help_url_battery_defender),
- /* backupContext */ ""), /* requestCode */
- 0));
- cardPreference.setPrimaryButtonVisible(true);
+ cardPreference.setPrimaryButtonAction(
+ () -> {
+ var helpIntent =
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_battery_defender),
+ /* backupContext= */ "");
+ ActivityCompat.startActivityForResult(
+ (Activity) preference.getContext(),
+ helpIntent,
+ /* requestCode= */ 0,
+ /* options= */ null);
+
+ return Unit.INSTANCE;
+ });
+ cardPreference.setPrimaryButtonVisibility(true);
cardPreference.setPrimaryButtonContentDescription(
context.getString(
R.string.battery_tip_limited_temporarily_sec_button_content_description));
cardPreference.setSecondaryButtonText(
context.getString(R.string.battery_tip_charge_to_full_button));
- cardPreference.setSecondaryButtonClickListener(
- unused -> {
+ cardPreference.setSecondaryButtonAction(
+ () -> {
resumeCharging(context);
preference.setVisible(false);
+
+ return Unit.INSTANCE;
});
- cardPreference.setSecondaryButtonVisible(mIsPluggedIn);
+ cardPreference.setSecondaryButtonVisibility(mIsPluggedIn);
+ cardPreference.buildContent();
}
private void resumeCharging(Context context) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
index 882b755..c9ff864 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
@@ -16,11 +16,13 @@
package com.android.settings.fuelgauge.batterytip.tips;
+import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Parcel;
import android.util.Log;
+import androidx.core.app.ActivityCompat;
import androidx.preference.Preference;
import com.android.settings.R;
@@ -28,6 +30,8 @@
import com.android.settingslib.HelpUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import kotlin.Unit;
+
/** Tip to show incompatible charger state */
public final class IncompatibleChargerTip extends BatteryTip {
private static final String TAG = "IncompatibleChargerTip";
@@ -77,18 +81,27 @@
}
cardPreference.setSelectable(false);
+ cardPreference.setIconResId(getIconId());
cardPreference.setPrimaryButtonText(context.getString(R.string.learn_more));
- cardPreference.setPrimaryButtonClickListener(
- button ->
- button.startActivityForResult(
- HelpUtils.getHelpIntent(
- context,
- context.getString(R.string.help_url_incompatible_charging),
- /* backupContext */ ""), /* requestCode */
- 0));
- cardPreference.setPrimaryButtonVisible(true);
+ cardPreference.setPrimaryButtonAction(
+ () -> {
+ var helpIntent =
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_incompatible_charging),
+ /* backupContext */ "");
+ ActivityCompat.startActivityForResult(
+ (Activity) context,
+ helpIntent,
+ /* requestCode= */ 0,
+ /* options= */ null);
+
+ return Unit.INSTANCE;
+ });
+ cardPreference.setPrimaryButtonVisibility(true);
cardPreference.setPrimaryButtonContentDescription(
context.getString(R.string.battery_tip_incompatible_charging_content_description));
+ cardPreference.buildContent();
}
public static final Creator CREATOR =
diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
index c6b1bdb..c40212b 100644
--- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
+++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
@@ -41,7 +41,6 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
-import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial;
import com.android.settings.core.SubSettingLauncher;
@@ -354,7 +353,7 @@
private boolean isAnyServiceSupportAccessibilityButton() {
final AccessibilityManager ams = getContext().getSystemService(AccessibilityManager.class);
final List<String> targets = ams.getAccessibilityShortcutTargets(
- ShortcutConstants.UserShortcutType.SOFTWARE);
+ AccessibilityManager.ACCESSIBILITY_BUTTON);
return !targets.isEmpty();
}
diff --git a/src/com/android/settings/localepicker/TermsOfAddressFeminineController.java b/src/com/android/settings/localepicker/TermsOfAddressFeminineController.java
index 9a46872..fdc4589 100644
--- a/src/com/android/settings/localepicker/TermsOfAddressFeminineController.java
+++ b/src/com/android/settings/localepicker/TermsOfAddressFeminineController.java
@@ -35,7 +35,7 @@
@Override
protected int getMetricsActionKey() {
- return SettingsEnums.ACTION_TERMS_OF_ADDRESS_FEMININE;
+ return 0;
}
@Override
diff --git a/src/com/android/settings/localepicker/TermsOfAddressMasculineController.java b/src/com/android/settings/localepicker/TermsOfAddressMasculineController.java
index cb39df0..8601113 100644
--- a/src/com/android/settings/localepicker/TermsOfAddressMasculineController.java
+++ b/src/com/android/settings/localepicker/TermsOfAddressMasculineController.java
@@ -35,7 +35,7 @@
@Override
protected int getMetricsActionKey() {
- return SettingsEnums.ACTION_TERMS_OF_ADDRESS_MASCULINE;
+ return 0;
}
@Override
diff --git a/src/com/android/settings/localepicker/TermsOfAddressNeutralController.java b/src/com/android/settings/localepicker/TermsOfAddressNeutralController.java
index e0693b5..e67bd4d 100644
--- a/src/com/android/settings/localepicker/TermsOfAddressNeutralController.java
+++ b/src/com/android/settings/localepicker/TermsOfAddressNeutralController.java
@@ -35,7 +35,7 @@
@Override
protected int getMetricsActionKey() {
- return SettingsEnums.ACTION_TERMS_OF_ADDRESS_NEUTRAL;
+ return 0;
}
@Override
diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt
new file mode 100644
index 0000000..f5dc886
--- /dev/null
+++ b/src/com/android/settings/network/SimOnboardingActivity.kt
@@ -0,0 +1,430 @@
+/*
+ * 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.network
+
+import android.app.ProgressDialog
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.telephony.SubscriptionManager
+import android.util.Log
+import android.view.MotionEvent
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.SignalCellularAlt
+import androidx.compose.material3.Button
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.ModalBottomSheet
+import androidx.compose.material3.SheetState
+import androidx.compose.material3.Text
+import androidx.compose.material3.rememberModalBottomSheetState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
+import com.android.settings.R
+import com.android.settings.SidecarFragment
+import com.android.settings.network.telephony.SubscriptionActionDialogActivity
+import com.android.settings.spa.SpaActivity.Companion.startSpaActivity
+import com.android.settings.spa.network.SimOnboardingPageProvider.getRoute
+import com.android.settingslib.spa.SpaBaseDialogActivity
+import com.android.settingslib.spa.framework.theme.SettingsDimension
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+import com.android.settingslib.spa.widget.ui.SettingsTitle
+import com.android.settingslib.spaprivileged.framework.common.userManager
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.catch
+import kotlinx.coroutines.flow.conflate
+import kotlinx.coroutines.launch
+
+class SimOnboardingActivity : SpaBaseDialogActivity() {
+ lateinit var scope: CoroutineScope
+ lateinit var showBottomSheet: MutableState<Boolean>
+ lateinit var showError: MutableState<Boolean>
+ lateinit var showDialog: MutableState<Boolean>
+
+ private var switchToEuiccSubscriptionSidecar: SwitchToEuiccSubscriptionSidecar? = null
+ private var switchToRemovableSlotSidecar: SwitchToRemovableSlotSidecar? = null
+ private var enableMultiSimSidecar: EnableMultiSimSidecar? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (!this.userManager.isAdminUser) {
+ Log.e(TAG, "It is not the admin user. Unable to toggle subscription.")
+ finish()
+ return
+ }
+
+ var targetSubId = intent.getIntExtra(SUB_ID,SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+ initServiceData(this, targetSubId, callbackListener)
+ if (!onboardingService.isUsableTargetSubscriptionId) {
+ Log.e(TAG, "The subscription id is not usable.")
+ finish()
+ return
+ }
+
+ switchToEuiccSubscriptionSidecar = SwitchToEuiccSubscriptionSidecar.get(fragmentManager)
+ switchToRemovableSlotSidecar = SwitchToRemovableSlotSidecar.get(fragmentManager)
+ enableMultiSimSidecar = EnableMultiSimSidecar.get(fragmentManager)
+
+ setContent {
+ Content()
+ }
+ }
+
+ override fun finish() {
+ setProgressDialog(false)
+ onboardingService.clear()
+ super.finish()
+ }
+
+ var callbackListener: (Int) -> Unit = {
+ Log.d(TAG, "Receive the CALLBACK: $it")
+ when (it) {
+ CALLBACK_ERROR -> {
+ setProgressDialog(false)
+ showError.value = true
+ }
+
+ CALLBACK_ONBOARDING_COMPLETE -> {
+ showBottomSheet.value = false
+ setProgressDialog(true)
+ scope.launch {
+ // TODO: refactor the Sidecar
+ // start to activate the sim
+ startSimSwitching()
+ }
+ }
+
+ CALLBACK_SETUP_NAME -> {
+ scope.launch {
+ onboardingService.startSetupName()
+ }
+ }
+
+ CALLBACK_SETUP_PRIMARY_SIM -> {
+ scope.launch {
+ onboardingService.startSetupPrimarySim(this@SimOnboardingActivity)
+ }
+ }
+
+ CALLBACK_FINISH -> {
+ finish()
+ }
+ }
+ }
+
+ fun setProgressDialog(enable: Boolean) {
+ showDialog.value = enable
+ val progressState = if (enable) {
+ SubscriptionActionDialogActivity.PROGRESS_IS_SHOWING
+ } else {
+ SubscriptionActionDialogActivity.PROGRESS_IS_NOT_SHOWING
+ }
+ setProgressState(progressState)
+ }
+
+ @OptIn(ExperimentalMaterial3Api::class)
+ @Composable
+ override fun Content() {
+ showBottomSheet = remember { mutableStateOf(true) }
+ showError = remember { mutableStateOf(false) }
+ showDialog = remember { mutableStateOf(false) }
+ scope = rememberCoroutineScope()
+
+ registerSidecarReceiverFlow()
+
+ if(showError.value){
+ // show error
+ return
+ }
+
+ if (showBottomSheet.value) {
+ var sheetState = rememberModalBottomSheetState()
+ BottomSheetImpl(
+ sheetState = sheetState,
+ nextAction = {
+ // TODO: if the phone is SS mode and the isDsdsConditionSatisfied is true, then
+ // enable the DSDS mode.
+ // case#1: the device need the reboot after enabling DSDS. Showing the confirm
+ // dialog to user whether reboot device or not.
+ // case#2: The device don't need the reboot. Enabling DSDS and then showing
+ // the SIM onboarding UI.
+
+ // case#2
+ val route = getRoute(onboardingService.targetSubId)
+ startSpaActivity(route)
+ },
+ cancelAction = { finish() },
+ )
+ } else {
+ ProgressDialogImpl()
+ }
+ }
+
+ @Composable
+ fun ProgressDialogImpl() {
+ // TODO: 1. Create the SPA's ProgressDialog and using SPA's widget
+ val dialog: ProgressDialog = object : ProgressDialog(this) {
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ return true
+ }
+ }
+ dialog.setMessage(
+ stringResource(
+ R.string.sim_onboarding_progressbar_turning_sim_on,
+ onboardingService.targetSubInfo?.displayName ?: ""
+ )
+ )
+ dialog.setCancelable(false)
+
+ if(showDialog.value) {
+ dialog.show()
+ }
+ }
+ @Composable
+ fun registerSidecarReceiverFlow(){
+ switchToEuiccSubscriptionSidecar?.sidecarReceiverFlow()
+ ?.collectLatestWithLifecycle(LocalLifecycleOwner.current) {
+ onStateChange(it)
+ }
+ switchToRemovableSlotSidecar?.sidecarReceiverFlow()
+ ?.collectLatestWithLifecycle(LocalLifecycleOwner.current) {
+ onStateChange(it)
+ }
+ enableMultiSimSidecar?.sidecarReceiverFlow()
+ ?.collectLatestWithLifecycle(LocalLifecycleOwner.current) {
+ onStateChange(it)
+ }
+ }
+
+ fun SidecarFragment.sidecarReceiverFlow(): Flow<SidecarFragment> = callbackFlow {
+ val broadcastReceiver = SidecarFragment.Listener {
+ Log.d(TAG, "onReceive: $it")
+ trySend(it)
+ }
+ addListener(broadcastReceiver)
+
+ awaitClose { removeListener(broadcastReceiver) }
+ }.catch { e ->
+ Log.e(TAG, "Error while sidecarReceiverFlow", e)
+ }.conflate()
+
+ fun startSimSwitching(){
+ Log.d(TAG, "startSimSwitching:")
+
+ var targetSubInfo = onboardingService.targetSubInfo
+ targetSubInfo?.let {
+ var removedSubInfo = onboardingService.getRemovedSim()
+ if (targetSubInfo.isEmbedded) {
+ switchToEuiccSubscriptionSidecar!!.run(
+ targetSubInfo.subscriptionId,
+ UiccSlotUtil.INVALID_PORT_ID,
+ removedSubInfo
+ )
+ return@let
+ }
+ switchToRemovableSlotSidecar!!.run(
+ UiccSlotUtil.INVALID_PHYSICAL_SLOT_ID,
+ removedSubInfo
+ )
+ } ?: run {
+ Log.e(TAG, "no target subInfo in onboardingService")
+ finish()
+ }
+ }
+
+ fun onStateChange(fragment: SidecarFragment?) {
+ if (fragment === switchToEuiccSubscriptionSidecar) {
+ handleSwitchToEuiccSubscriptionSidecarStateChange()
+ } else if (fragment === switchToRemovableSlotSidecar) {
+ handleSwitchToRemovableSlotSidecarStateChange()
+ } else if (fragment === enableMultiSimSidecar) {
+ handleEnableMultiSimSidecarStateChange()
+ }
+ }
+
+ fun handleSwitchToEuiccSubscriptionSidecarStateChange() {
+ when (switchToEuiccSubscriptionSidecar!!.state) {
+ SidecarFragment.State.SUCCESS -> {
+ Log.i(TAG, "Successfully enable the eSIM profile.")
+ switchToEuiccSubscriptionSidecar!!.reset()
+ callbackListener(CALLBACK_SETUP_NAME)
+ }
+
+ SidecarFragment.State.ERROR -> {
+ Log.i(TAG, "Failed to enable the eSIM profile.")
+ switchToEuiccSubscriptionSidecar!!.reset()
+ callbackListener(CALLBACK_ERROR)
+ // TODO: showErrorDialog and using privileged_action_disable_fail_title and
+ // privileged_action_disable_fail_text
+ }
+ }
+ }
+
+ fun handleSwitchToRemovableSlotSidecarStateChange() {
+ when (switchToRemovableSlotSidecar!!.state) {
+ SidecarFragment.State.SUCCESS -> {
+ Log.i(TAG, "Successfully switched to removable slot.")
+ switchToRemovableSlotSidecar!!.reset()
+ onboardingService.handleTogglePsimAction()
+ callbackListener(CALLBACK_SETUP_NAME)
+ }
+
+ SidecarFragment.State.ERROR -> {
+ Log.e(TAG, "Failed switching to removable slot.")
+ switchToRemovableSlotSidecar!!.reset()
+ callbackListener(CALLBACK_ERROR)
+ // TODO: showErrorDialog and using sim_action_enable_sim_fail_title and
+ // sim_action_enable_sim_fail_text
+ }
+ }
+ }
+
+ fun handleEnableMultiSimSidecarStateChange() {
+ when (enableMultiSimSidecar!!.state) {
+ SidecarFragment.State.SUCCESS -> {
+ enableMultiSimSidecar!!.reset()
+ Log.i(TAG, "Successfully switched to DSDS without reboot.")
+ handleEnableSubscriptionAfterEnablingDsds()
+ }
+
+ SidecarFragment.State.ERROR -> {
+ enableMultiSimSidecar!!.reset()
+ Log.i(TAG, "Failed to switch to DSDS without rebooting.")
+ callbackListener(CALLBACK_ERROR)
+ // TODO: showErrorDialog and using dsds_activation_failure_title and
+ // dsds_activation_failure_body_msg2
+ }
+ }
+ }
+
+ fun handleEnableSubscriptionAfterEnablingDsds() {
+ var targetSubInfo = onboardingService.targetSubInfo
+ if (targetSubInfo?.isEmbedded == true) {
+ Log.i(TAG,
+ "DSDS enabled, start to enable profile: " + targetSubInfo.getSubscriptionId()
+ )
+ // For eSIM operations, we simply switch to the selected eSIM profile.
+ switchToEuiccSubscriptionSidecar!!.run(
+ targetSubInfo.subscriptionId,
+ UiccSlotUtil.INVALID_PORT_ID,
+ null
+ )
+ return
+ }
+ Log.i(TAG, "DSDS enabled, start to enable pSIM profile.")
+ onboardingService.handleTogglePsimAction()
+ callbackListener(CALLBACK_FINISH)
+ }
+
+ @Composable
+ fun BottomSheetBody(nextAction: () -> Unit) {
+ Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(bottom = SettingsDimension.itemPaddingVertical)) {
+ Icon(
+ imageVector = Icons.Outlined.SignalCellularAlt,
+ contentDescription = null,
+ modifier = Modifier
+ .size(SettingsDimension.iconLarge),
+ tint = MaterialTheme.colorScheme.primary,
+ )
+ SettingsTitle(stringResource(R.string.sim_onboarding_bottomsheets_title))
+ Column(Modifier.padding(SettingsDimension.itemPadding)) {
+ Text(
+ text = stringResource(R.string.sim_onboarding_bottomsheets_msg),
+ color = MaterialTheme.colorScheme.onSurfaceVariant,
+ style = MaterialTheme.typography.bodyMedium,
+ overflow = TextOverflow.Ellipsis,
+ textAlign = TextAlign.Center
+ )
+ }
+ Button(onClick = nextAction) {
+ Text(stringResource(R.string.sim_onboarding_setup))
+ }
+ }
+ }
+
+ @OptIn(ExperimentalMaterial3Api::class)
+ @Composable
+ fun BottomSheetImpl(
+ sheetState: SheetState,
+ nextAction: () -> Unit,
+ cancelAction: () -> Unit,
+ ) {
+ ModalBottomSheet(
+ onDismissRequest = cancelAction,
+ sheetState = sheetState,
+ ) {
+ BottomSheetBody(nextAction = nextAction)
+ }
+ LaunchedEffect(Unit) {
+ sheetState.show()
+ }
+ }
+
+ fun setProgressState(state: Int) {
+ val prefs = getSharedPreferences(
+ SubscriptionActionDialogActivity.SIM_ACTION_DIALOG_PREFS,
+ MODE_PRIVATE
+ )
+ prefs.edit().putInt(SubscriptionActionDialogActivity.KEY_PROGRESS_STATE, state).apply()
+ Log.i(TAG, "setProgressState:$state")
+ }
+
+ fun initServiceData(context: Context,targetSubId: Int, callback:(Int)->Unit) {
+ onboardingService.initData(targetSubId, context,callback)
+ }
+
+ companion object {
+ @JvmStatic
+ fun startSimOnboardingActivity(
+ context: Context,
+ subId: Int,
+ ) {
+ val intent = Intent(context, SimOnboardingActivity::class.java).apply {
+ putExtra(SUB_ID, subId)
+ }
+ context.startActivity(intent)
+ }
+
+ var onboardingService:SimOnboardingService = SimOnboardingService()
+ const val TAG = "SimOnboardingActivity"
+ const val SUB_ID = "sub_id"
+ const val CALLBACK_ERROR = -1
+ const val CALLBACK_ONBOARDING_COMPLETE = 1
+ const val CALLBACK_SETUP_NAME = 2
+ const val CALLBACK_SETUP_PRIMARY_SIM = 3
+ const val CALLBACK_FINISH = 4
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/network/SimOnboardingService.kt b/src/com/android/settings/network/SimOnboardingService.kt
index 1b3994e..8679385 100644
--- a/src/com/android/settings/network/SimOnboardingService.kt
+++ b/src/com/android/settings/network/SimOnboardingService.kt
@@ -23,11 +23,17 @@
import android.telephony.UiccCardInfo
import android.telephony.UiccSlotInfo
import android.util.Log
+import com.android.settings.spa.network.setAutomaticData
+import com.android.settings.spa.network.setDefaultData
+import com.android.settings.spa.network.setDefaultSms
+import com.android.settings.spa.network.setDefaultVoice
import com.android.settingslib.utils.ThreadUtils
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
private const val TAG = "SimOnboardingService"
-private const val INVALID = -1
+private const val INVALID = SubscriptionManager.INVALID_SUBSCRIPTION_ID
class SimOnboardingService {
var subscriptionManager:SubscriptionManager? = null
@@ -40,19 +46,72 @@
var slotInfoList: List<UiccSlotInfo> = listOf()
var uiccCardInfoList: List<UiccCardInfo> = listOf()
var selectedSubInfoList: MutableList<SubscriptionInfo> = mutableListOf()
- var targetPrimarySimCalls: Int = -1
- var targetPrimarySimTexts: Int = -1
- var targetPrimarySimMobileData: Int = -1
+ var targetPrimarySimCalls: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ var targetPrimarySimTexts: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ var targetPrimarySimMobileData: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ var targetPrimarySimAutoDataSwitch: Boolean = false
+ var targetNonDds: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ get() {
+ if(targetPrimarySimMobileData == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ Log.w(TAG, "No DDS")
+ return SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ }
+ return selectedSubInfoList
+ .filter { info ->
+ (info.simSlotIndex != -1) && (info.subscriptionId != targetPrimarySimMobileData)
+ }
+ .map { it.subscriptionId }
+ .firstOrNull() ?: SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ }
+ var callback: (Int) -> Unit = {}
+
var isMultipleEnabledProfilesSupported: Boolean = false
get() {
if (uiccCardInfoList.isEmpty()) {
Log.w(TAG, "UICC cards info list is empty.")
return false
}
- return uiccCardInfoList.stream()
- .anyMatch { cardInfo: UiccCardInfo -> cardInfo.isMultipleEnabledProfilesSupported }
+ return uiccCardInfoList.any { it.isMultipleEnabledProfilesSupported }
}
+ var isRemovableSimEnabled: Boolean = false
+ get() {
+ if(slotInfoList.isEmpty()) {
+ Log.w(TAG, "UICC Slot info list is empty.")
+ return false
+ }
+ return UiccSlotUtil.isRemovableSimEnabled(slotInfoList)
+ }
+
+ var doesTargetSimHaveEsimOperation = false
+ get() {
+ return targetSubInfo?.isEmbedded ?: false
+ }
+
+ var isUsableTargetSubscriptionId = false
+ get() {
+ return SubscriptionManager.isUsableSubscriptionId(targetSubId)
+ }
+ var getActiveModemCount = 0
+ get() {
+ return telephonyManager?.getActiveModemCount() ?: 0
+ }
+
var renameMutableMap : MutableMap<Int, String> = mutableMapOf()
+ var userSelectedSubInfoList : MutableList<SubscriptionInfo> = mutableListOf()
+
+ var isSimSelectionFinished = false
+ get() {
+ return getActiveModemCount != 0 && userSelectedSubInfoList.size == getActiveModemCount
+ }
+
+ var isAllOfSlotAssigned = false
+ get() {
+ if(getActiveModemCount == 0){
+ Log.e(TAG, "isAllOfSlotAssigned: getActiveModemCount is 0")
+ return true
+ }
+ return getActiveModemCount != 0 && activeSubInfoList.size == getActiveModemCount
+ }
fun isValid(): Boolean {
return targetSubId != INVALID
@@ -73,18 +132,27 @@
targetPrimarySimCalls = -1
targetPrimarySimTexts = -1
targetPrimarySimMobileData = -1
- renameMutableMap.clear()
+ clearUserRecord()
}
- fun initData(inputTargetSubId:Int,context: Context) {
+ fun clearUserRecord(){
+ renameMutableMap.clear()
+ userSelectedSubInfoList.clear()
+ }
+
+ fun initData(inputTargetSubId:Int,context: Context, callback: (Int) -> Unit) {
+ this.callback = callback
targetSubId = inputTargetSubId
subscriptionManager = context.getSystemService(SubscriptionManager::class.java)
telephonyManager = context.getSystemService(TelephonyManager::class.java)
-
+ Log.d(
+ TAG, "startInit: targetSubId:$targetSubId"
+ )
ThreadUtils.postOnBackgroundThread {
activeSubInfoList = SubscriptionUtil.getActiveSubscriptions(subscriptionManager)
availableSubInfoList = SubscriptionUtil.getAvailableSubscriptions(context)
targetSubInfo = availableSubInfoList.find { subInfo -> subInfo.subscriptionId == targetSubId }
+ targetSubInfo?.let { userSelectedSubInfoList.add(it) }
Log.d(
TAG, "targetSubId: $targetSubId" + ", targetSubInfo: $targetSubInfo" +
". activeSubInfoList: $activeSubInfoList"
@@ -94,11 +162,24 @@
uiccCardInfoList = telephonyManager?.uiccCardsInfo!!
Log.d(TAG, "uiccCardInfoList: $uiccCardInfoList")
- Log.d(TAG, "isMultipleEnabledProfilesSupported: $isMultipleEnabledProfilesSupported")
+ targetPrimarySimCalls = SubscriptionManager.getDefaultVoiceSubscriptionId()
+ targetPrimarySimTexts = SubscriptionManager.getDefaultSmsSubscriptionId()
+ targetPrimarySimMobileData = SubscriptionManager.getDefaultDataSubscriptionId()
+ Log.d(
+ TAG,"doesTargetSimHaveEsimOperation: $doesTargetSimHaveEsimOperation" +
+ ", isRemovableSimEnabled: $isRemovableSimEnabled" +
+ ", isMultipleEnabledProfilesSupported: $isMultipleEnabledProfilesSupported" +
+ ", targetPrimarySimCalls: $targetPrimarySimCalls" +
+ ", targetPrimarySimTexts: $targetPrimarySimTexts" +
+ ", targetPrimarySimMobileData: $targetPrimarySimMobileData")
}
}
- fun getSelectableSubscriptionInfo(): List<SubscriptionInfo> {
+ /**
+ * Return the subscriptionInfo list which has
+ * the target subscriptionInfo + active subscriptionInfo.
+ */
+ fun getSelectableSubscriptionInfoList(): List<SubscriptionInfo> {
var list: MutableList<SubscriptionInfo> = mutableListOf()
list.addAll(activeSubInfoList)
if (!list.contains(targetSubInfo)) {
@@ -109,18 +190,102 @@
return list.toList()
}
+ /**
+ * Return the user selected SubscriptionInfo list.
+ */
+ fun getSelectedSubscriptionInfoList(): List<SubscriptionInfo> {
+ if (userSelectedSubInfoList.isEmpty()){
+ Log.d(TAG, "userSelectedSubInfoList is empty")
+ return activeSubInfoList
+ }
+ return userSelectedSubInfoList.toList()
+ }
+
fun addItemForRenaming(subInfo: SubscriptionInfo, newName: String) {
if (subInfo.displayName == newName) {
return
}
renameMutableMap[subInfo.subscriptionId] = newName
+ Log.d(TAG, "renameMutableMap add ${subInfo.subscriptionId} & $newName into: $renameMutableMap")
}
fun getSubscriptionInfoDisplayName(subInfo: SubscriptionInfo): String {
return renameMutableMap[subInfo.subscriptionId] ?: subInfo.displayName.toString()
}
- fun startActivatingSim(callback:() -> Unit){
+ fun addCurrentItemForSelectedSim(){
+ userSelectedSubInfoList.addAll(activeSubInfoList)
+ }
+
+ fun addItemForSelectedSim(selectedSubInfo: SubscriptionInfo) {
+ userSelectedSubInfoList.add(selectedSubInfo)
+ }
+
+ fun removeItemForSelectedSim(selectedSubInfo: SubscriptionInfo) {
+ if (userSelectedSubInfoList.contains(selectedSubInfo)) {
+ userSelectedSubInfoList.remove(selectedSubInfo)
+ }
+ }
+
+ /**
+ * Return the subscriptionInfo which will be removed in the slot during the sim onboarding.
+ * If return Null, then no subscriptionInfo will be removed in the slot.
+ */
+ fun getRemovedSim():SubscriptionInfo?{
+ return activeSubInfoList.find { !userSelectedSubInfoList.contains(it) }
+ }
+
+ fun handleTogglePsimAction() {
+ val canDisablePhysicalSubscription =
+ subscriptionManager?.canDisablePhysicalSubscription() == true
+ if (targetSubInfo != null && canDisablePhysicalSubscription) {
+ // TODO: to support disable case.
+ subscriptionManager?.setUiccApplicationsEnabled(
+ targetSubInfo!!.subscriptionId, /*enabled=*/true)
+ } else {
+ Log.i(TAG, "The device does not support toggling pSIM. It is enough to just "
+ + "enable the removable slot."
+ )
+ }
+ }
+
+ fun startActivatingSim(){
// TODO: start to activate sim
+ callback(SimOnboardingActivity.CALLBACK_FINISH)
+ }
+
+ suspend fun startSetupName() {
+ withContext(Dispatchers.Default) {
+ renameMutableMap.forEach {
+ subscriptionManager?.setDisplayName(
+ it.value, it.key,
+ SubscriptionManager.NAME_SOURCE_USER_INPUT
+ )
+ }
+ // next action is SETUP_PRIMARY_SIM
+ callback(SimOnboardingActivity.CALLBACK_SETUP_PRIMARY_SIM)
+ }
+ }
+
+ suspend fun startSetupPrimarySim(context: Context) {
+ withContext(Dispatchers.Default) {
+ setDefaultVoice(subscriptionManager,targetPrimarySimCalls)
+ setDefaultSms(subscriptionManager,targetPrimarySimTexts)
+ setDefaultData(
+ context,
+ subscriptionManager,
+ null,
+ targetPrimarySimMobileData
+ )
+
+
+ val telephonyManagerForNonDds: TelephonyManager? =
+ context.getSystemService(TelephonyManager::class.java)
+ ?.createForSubscriptionId(targetNonDds)
+ setAutomaticData(telephonyManagerForNonDds, targetPrimarySimAutoDataSwitch)
+
+ // no next action, send finish
+ callback(SimOnboardingActivity.CALLBACK_FINISH)
+ }
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index b6b433b..84e4e75 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -48,8 +48,6 @@
import com.android.settings.network.helper.SubscriptionAnnotation;
import com.android.settings.network.telephony.DeleteEuiccSubscriptionDialogActivity;
import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity;
-import com.android.settings.spa.SpaActivity;
-import com.android.settings.spa.network.SimOnboardingPageProvider;
import java.util.ArrayList;
import java.util.Collections;
@@ -546,8 +544,7 @@
return;
}
if (enable && Flags.isDualSimOnboardingEnabled()) {
- String route = SimOnboardingPageProvider.INSTANCE.getRoute(subId);
- SpaActivity.startSpaActivity(context, route);
+ SimOnboardingActivity.startSimOnboardingActivity(context, subId);
return;
}
context.startActivity(ToggleSubscriptionDialogActivity.getIntent(context, subId, enable));
diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java
index 5175c23..df23f12 100644
--- a/src/com/android/settings/network/UiccSlotUtil.java
+++ b/src/com/android/settings/network/UiccSlotUtil.java
@@ -463,17 +463,27 @@
if (telMgr == null) {
return false;
}
- ImmutableList<UiccSlotInfo> slotInfos = UiccSlotUtil.getSlotInfos(telMgr);
+ List<UiccSlotInfo> slotInfos = UiccSlotUtil.getSlotInfos(telMgr);
+ return isRemovableSimEnabled(slotInfos);
+ }
+
+ /**
+ * Return whether the removable psim is enabled.
+ *
+ * @param slotInfos is a List of UiccSlotInfo.
+ * @return whether the removable psim is enabled.
+ */
+ public static boolean isRemovableSimEnabled(List<UiccSlotInfo> slotInfos) {
boolean isRemovableSimEnabled =
slotInfos.stream()
.anyMatch(
slot -> slot != null
&& slot.isRemovable()
&& !slot.getIsEuicc()
- && slot.getPorts().stream().anyMatch(
- port -> port.isActive())
+ && slot.getPorts().stream()
+ .anyMatch(port -> port.isActive())
&& slot.getCardStateInfo()
- == UiccSlotInfo.CARD_STATE_INFO_PRESENT);
+ == UiccSlotInfo.CARD_STATE_INFO_PRESENT);
Log.i(TAG, "isRemovableSimEnabled: " + isRemovableSimEnabled);
return isRemovableSimEnabled;
}
diff --git a/src/com/android/settings/network/telephony/AutoDataSwitchPreferenceController.java b/src/com/android/settings/network/telephony/AutoDataSwitchPreferenceController.java
index 378d9a1..ef74a2e 100644
--- a/src/com/android/settings/network/telephony/AutoDataSwitchPreferenceController.java
+++ b/src/com/android/settings/network/telephony/AutoDataSwitchPreferenceController.java
@@ -42,6 +42,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.datausage.DataUsageUtils;
+import com.android.settings.flags.Flags;
import com.android.settings.network.MobileDataContentObserver;
import com.android.settings.network.ProxySubscriptionManager;
import com.android.settings.network.SubscriptionsChangeListener;
@@ -194,7 +195,8 @@
@Override
public int getAvailabilityStatus(int subId) {
- if (!SubscriptionManager.isValidSubscriptionId(subId)
+ if (Flags.isDualSimOnboardingEnabled()
+ || !SubscriptionManager.isValidSubscriptionId(subId)
|| SubscriptionManager.getDefaultDataSubscriptionId() == subId
|| (!hasMobileData())) {
return CONDITIONALLY_UNAVAILABLE;
diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
index 206b3a9..03ce7f6 100644
--- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
+++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
@@ -32,6 +32,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.flags.Flags;
import com.android.settings.network.DefaultSubscriptionReceiver;
import com.android.settings.network.MobileNetworkRepository;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -88,6 +89,9 @@
@Override
public int getAvailabilityStatus(int subId) {
+ if (Flags.isDualSimOnboardingEnabled()) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
return AVAILABLE;
}
diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
index 06015d4..bec7ee7 100644
--- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
+++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
@@ -34,6 +34,7 @@
import androidx.preference.TwoStatePreference;
import com.android.settings.R;
+import com.android.settings.flags.Flags;
import com.android.settings.network.MobileNetworkRepository;
import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -83,6 +84,9 @@
@Override
public int getAvailabilityStatus(int subId) {
+ if (Flags.isDualSimOnboardingEnabled()) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
? AVAILABLE
: AVAILABLE_UNSEARCHABLE;
diff --git a/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt
new file mode 100644
index 0000000..907bab1
--- /dev/null
+++ b/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt
@@ -0,0 +1,220 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import android.telephony.TelephonyManager
+import android.telephony.euicc.EuiccManager
+import android.text.TextUtils
+import android.util.Log
+import android.view.WindowManager
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.annotation.VisibleForTesting
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import com.android.settings.R
+import com.android.settings.deviceinfo.PhoneNumberUtil
+import com.android.settings.flags.Flags
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.android.settingslib.CustomDialogPreferenceCompat
+import com.android.settingslib.Utils
+import com.android.settingslib.qrcode.QrCodeGenerator
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+import com.android.settingslib.spaprivileged.framework.common.userManager
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Preference controller for "EID"
+ */
+open class MobileNetworkEidPreferenceController(context: Context, key: String) :
+ TelephonyBasePreferenceController(context, key) {
+
+ private lateinit var lazyViewModel: Lazy<SubscriptionInfoListViewModel>
+ private lateinit var preference: CustomDialogPreferenceCompat
+ private lateinit var fragment: Fragment
+ private var coroutineScope: CoroutineScope? = null
+ private var title = String()
+ private var eid = String()
+
+ fun init(fragment: Fragment, subId: Int) {
+ this.fragment = fragment
+ lazyViewModel = fragment.viewModels()
+ mSubId = subId
+ }
+
+ override fun getAvailabilityStatus(subId: Int): Int = when {
+ !Flags.isDualSimOnboardingEnabled() -> CONDITIONALLY_UNAVAILABLE
+ SubscriptionManager.isValidSubscriptionId(subId)
+ && eid.isNotEmpty()
+ && mContext.userManager.isAdminUser -> AVAILABLE
+
+ else -> CONDITIONALLY_UNAVAILABLE
+ }
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ super.displayPreference(screen)
+ preference = screen.findPreference(preferenceKey)!!
+ }
+
+ override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ preference.isVisible = false
+
+ val viewModel by lazyViewModel
+ coroutineScope = viewLifecycleOwner.lifecycleScope
+ viewModel.subscriptionInfoListFlow
+ .map { subscriptionInfoList ->
+ subscriptionInfoList
+ .firstOrNull { subInfo ->
+ subInfo.subscriptionId == mSubId && subInfo.isEmbedded
+ }
+ }
+ .collectLatestWithLifecycle(viewLifecycleOwner) { subscriptionInfo ->
+ subscriptionInfo?.let {
+ coroutineScope?.launch {
+ refreshData(it)
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ suspend fun refreshData(subscriptionInfo: SubscriptionInfo) {
+ withContext(Dispatchers.Default) {
+ eid = getEid(subscriptionInfo)
+ if (eid.isEmpty()) {
+ Log.d(TAG, "EID is empty.")
+ }
+ title = getTitle()
+ }
+ refreshUi()
+ }
+
+ fun refreshUi() {
+ preference.title = title
+ preference.dialogTitle = title
+ preference.summary = eid
+ preference.isVisible = eid.isNotEmpty()
+ }
+
+ override fun handlePreferenceTreeClick(preference: Preference): Boolean {
+ if (preference.key != preferenceKey) return false
+ this.preference.setOnShowListener {
+ coroutineScope?.launch { updateDialog() }
+ }
+ return true
+ }
+
+ private fun getTitle(): String {
+ return mContext.getString(R.string.status_eid)
+ }
+
+ private suspend fun updateDialog() {
+ val dialog = preference.dialog ?: return
+ dialog.window?.setFlags(
+ WindowManager.LayoutParams.FLAG_SECURE,
+ WindowManager.LayoutParams.FLAG_SECURE
+ )
+ dialog.setCanceledOnTouchOutside(false)
+ val textView = dialog.requireViewById<TextView>(R.id.esim_id_value)
+ textView.text = PhoneNumberUtil.expandByTts(eid)
+
+ val qrCodeView = dialog.requireViewById<ImageView>(R.id.esim_id_qrcode)
+
+ qrCodeView.setImageBitmap(getEidQrCode(eid))
+ }
+
+ protected fun getTelephonyManager(context: Context): TelephonyManager? {
+ return context.getSystemService(TelephonyManager::class.java)
+ }
+
+ protected fun getEuiccManager(context: Context): EuiccManager? {
+ return context.getSystemService(EuiccManager::class.java)
+ }
+
+ @VisibleForTesting
+ fun getEid(subscriptionInfo: SubscriptionInfo): String {
+ val euiccMgr = getEuiccManager(mContext)
+ val telMgr = getTelephonyManager(mContext)
+ if(euiccMgr==null || telMgr==null) return String()
+
+ var eid = getEidPerSlot(telMgr, euiccMgr, subscriptionInfo)
+ return eid.ifEmpty {
+ getDefaultEid(euiccMgr)
+ }
+ }
+
+ private fun getEidPerSlot(
+ telMgr: TelephonyManager,
+ euiccMgr: EuiccManager,
+ subscriptionInfo: SubscriptionInfo
+ ): String {
+ val uiccCardInfoList = telMgr.uiccCardsInfo
+ val cardId = subscriptionInfo.cardId
+
+ /**
+ * Find EID from first slot which contains an eSIM and with card ID within
+ * the eSIM card ID provided by SubscriptionManager.
+ */
+ return uiccCardInfoList.firstOrNull { cardInfo -> cardInfo.isEuicc && cardInfo.cardId == cardId }
+ ?.let { cardInfo ->
+ var eid = cardInfo.getEid()
+ if (TextUtils.isEmpty(eid)) {
+ eid = euiccMgr.createForCardId(cardInfo.cardId).getEid()
+ }
+ eid
+ } ?: String()
+ }
+
+ private fun getDefaultEid(euiccMgr: EuiccManager?): String {
+ return if (euiccMgr == null || !euiccMgr.isEnabled) {
+ String()
+ } else euiccMgr.getEid() ?: String()
+ }
+
+ companion object {
+ private const val TAG = "MobileNetworkEidPreferenceController"
+ private const val QR_CODE_SIZE = 600
+
+ /**
+ * Gets the QR code for EID
+ * @param eid is the EID string
+ * @return a Bitmap of QR code
+ */
+ private suspend fun getEidQrCode(eid: String): Bitmap? = withContext(Dispatchers.Default) {
+ try {
+ Log.d(TAG, "updateDialog. getEidQrCode $eid")
+ QrCodeGenerator.encodeQrCode(contents = eid, size = QR_CODE_SIZE)
+ } catch (exception: Exception) {
+ Log.w(TAG, "Error when creating QR code width $QR_CODE_SIZE", exception)
+ null
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt
new file mode 100644
index 0000000..8ec313b
--- /dev/null
+++ b/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt
@@ -0,0 +1,145 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.os.UserManager
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import android.telephony.TelephonyManager
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import com.android.settings.R
+import com.android.settings.deviceinfo.imei.ImeiInfoDialogFragment
+import com.android.settings.flags.Flags
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.android.settingslib.Utils
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+import com.android.settingslib.spaprivileged.framework.common.userManager
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Preference controller for "IMEI"
+ */
+class MobileNetworkImeiPreferenceController(context: Context, key: String) :
+ TelephonyBasePreferenceController(context, key) {
+
+ private lateinit var lazyViewModel: Lazy<SubscriptionInfoListViewModel>
+ private lateinit var preference: Preference
+ private lateinit var fragment: Fragment
+ private lateinit var mTelephonyManager: TelephonyManager
+ private var simSlot = -1
+ private var imei = String()
+ private var title = String()
+
+ fun init(fragment: Fragment, subId: Int) {
+ this.fragment = fragment
+ lazyViewModel = fragment.viewModels()
+ mSubId = subId
+ mTelephonyManager = mContext.getSystemService(TelephonyManager::class.java)
+ ?.createForSubscriptionId(mSubId)!!
+ }
+
+ override fun getAvailabilityStatus(subId: Int): Int = when {
+ !Flags.isDualSimOnboardingEnabled() -> CONDITIONALLY_UNAVAILABLE
+ SubscriptionManager.isValidSubscriptionId(subId)
+ && SubscriptionUtil.isSimHardwareVisible(mContext)
+ && mContext.userManager.isAdminUser
+ && !Utils.isWifiOnly(mContext) -> AVAILABLE
+ else -> CONDITIONALLY_UNAVAILABLE
+ }
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ super.displayPreference(screen)
+ preference = screen.findPreference(preferenceKey)!!
+ }
+
+ override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ val viewModel by lazyViewModel
+ val coroutineScope = viewLifecycleOwner.lifecycleScope
+
+ viewModel.subscriptionInfoListFlow
+ .collectLatestWithLifecycle(viewLifecycleOwner) { subscriptionInfoList ->
+ subscriptionInfoList
+ .firstOrNull { subInfo -> subInfo.subscriptionId == mSubId }
+ ?.let {
+ coroutineScope.launch {
+ refreshData(it)
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ suspend fun refreshData(subscription:SubscriptionInfo){
+ withContext(Dispatchers.Default) {
+ title = getTitle()
+ imei = getImei()
+ simSlot = subscription.simSlotIndex
+ }
+ refreshUi()
+ }
+
+ private fun refreshUi(){
+ preference.title = title
+ preference.summary = imei
+ preference.isVisible = true
+ }
+
+ override fun handlePreferenceTreeClick(preference: Preference): Boolean {
+ if (preference.key != preferenceKey) return false
+
+ Log.d(TAG, "handlePreferenceTreeClick:")
+ ImeiInfoDialogFragment.show(fragment, simSlot, preference.title.toString())
+ return true
+ }
+ private fun getImei(): String {
+ val phoneType = getPhoneType()
+ return if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) mTelephonyManager.meid?: String()
+ else mTelephonyManager.imei?: String()
+ }
+ private fun getTitleForGsmPhone(): String {
+ return mContext.getString(R.string.status_imei)
+ }
+
+ private fun getTitleForCdmaPhone(): String {
+ return mContext.getString(R.string.status_meid_number)
+ }
+
+ private fun getTitle(): String {
+ val phoneType = getPhoneType()
+ return if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) getTitleForCdmaPhone()
+ else getTitleForGsmPhone()
+ }
+
+ fun getPhoneType(): Int {
+ return mTelephonyManager.currentPhoneType
+ }
+
+ companion object {
+ private const val TAG = "MobileNetworkImeiPreferenceController"
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt
new file mode 100644
index 0000000..65a4b7e
--- /dev/null
+++ b/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt
@@ -0,0 +1,112 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import androidx.annotation.VisibleForTesting
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import com.android.settings.R
+import com.android.settings.flags.Flags
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Preference controller for "Phone number"
+ */
+class MobileNetworkPhoneNumberPreferenceController(context: Context, key: String) :
+ TelephonyBasePreferenceController(context, key) {
+
+ private lateinit var lazyViewModel: Lazy<SubscriptionInfoListViewModel>
+ private lateinit var preference: Preference
+
+ private var phoneNumber = String()
+
+ fun init(fragment: Fragment, subId: Int) {
+ lazyViewModel = fragment.viewModels()
+ mSubId = subId
+ }
+
+ override fun getAvailabilityStatus(subId: Int): Int = when {
+ !Flags.isDualSimOnboardingEnabled() -> CONDITIONALLY_UNAVAILABLE
+ SubscriptionManager.isValidSubscriptionId(subId)
+ && SubscriptionUtil.isSimHardwareVisible(mContext) -> AVAILABLE
+ else -> CONDITIONALLY_UNAVAILABLE
+ }
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ super.displayPreference(screen)
+ preference = screen.findPreference(preferenceKey)!!
+ }
+
+ override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ val viewModel by lazyViewModel
+ val coroutineScope = viewLifecycleOwner.lifecycleScope
+
+ viewModel.subscriptionInfoListFlow
+ .map { subscriptionInfoList ->
+ subscriptionInfoList
+ .firstOrNull { subInfo -> subInfo.subscriptionId == mSubId }
+ }
+ .flowOn(Dispatchers.Default)
+ .collectLatestWithLifecycle(viewLifecycleOwner) {
+ it?.let {
+ coroutineScope.launch {
+ refreshData(it)
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ suspend fun refreshData(subscriptionInfo: SubscriptionInfo){
+ withContext(Dispatchers.Default) {
+ phoneNumber = getFormattedPhoneNumber(subscriptionInfo)
+ }
+ refreshUi()
+ }
+
+ private fun refreshUi(){
+ preference.summary = phoneNumber
+ }
+
+ private fun getFormattedPhoneNumber(subscriptionInfo: SubscriptionInfo?): String {
+ val phoneNumber = SubscriptionUtil.getBidiFormattedPhoneNumber(
+ mContext,
+ subscriptionInfo
+ )
+ return phoneNumber
+ ?.let { return it.ifEmpty { getStringUnknown() } }
+ ?: getStringUnknown()
+ }
+
+ private fun getStringUnknown(): String {
+ return mContext.getString(R.string.device_info_default)
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 4188f8d..2f2b20e 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -85,6 +85,7 @@
private static final String KEY_SMS_PREF = "sms_preference";
private static final String KEY_MOBILE_DATA_PREF = "mobile_data_enable";
private static final String KEY_CONVERT_TO_ESIM_PREF = "convert_to_esim";
+ private static final String KEY_EID_KEY = "network_mode_eid_info";
//String keys for preference lookup
private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
@@ -171,6 +172,10 @@
String.valueOf(mSubId));
});
+ MobileNetworkEidPreferenceController eid = new MobileNetworkEidPreferenceController(context,
+ KEY_EID_KEY);
+ eid.init(this, mSubId);
+
return Arrays.asList(
new DataUsageSummaryPreferenceController(context, mSubId),
new RoamingPreferenceController(context, KEY_ROAMING_PREF, getSettingsLifecycle(),
@@ -182,7 +187,7 @@
new MobileDataPreferenceController(context, KEY_MOBILE_DATA_PREF,
getSettingsLifecycle(), this, mSubId),
new ConvertToEsimPreferenceController(context, KEY_CONVERT_TO_ESIM_PREF,
- getSettingsLifecycle(), this, mSubId));
+ getSettingsLifecycle(), this, mSubId), eid);
}
@Override
@@ -239,6 +244,10 @@
use(DisableSimFooterPreferenceController.class).init(mSubId);
use(NrDisabledInDsdsFooterPreferenceController.class).init(mSubId);
+ use(MobileNetworkSpnPreferenceController.class).init(this, mSubId);
+ use(MobileNetworkPhoneNumberPreferenceController.class).init(this, mSubId);
+ use(MobileNetworkImeiPreferenceController.class).init(this, mSubId);
+
final MobileDataPreferenceController mobileDataPreferenceController =
use(MobileDataPreferenceController.class);
if (mobileDataPreferenceController != null) {
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt
new file mode 100644
index 0000000..ac055b0
--- /dev/null
+++ b/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import androidx.annotation.VisibleForTesting
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.LifecycleOwner
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import com.android.settings.flags.Flags
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+
+/**
+ * Preference controller for "Mobile network" and showing the SPN.
+ */
+class MobileNetworkSpnPreferenceController(context: Context, key: String) :
+ TelephonyBasePreferenceController(context, key) {
+
+ private lateinit var lazyViewModel: Lazy<SubscriptionInfoListViewModel>
+ private lateinit var preference: Preference
+
+ private var spn = String()
+
+ fun init(fragment: Fragment, subId: Int) {
+ lazyViewModel = fragment.viewModels()
+ mSubId = subId
+ }
+
+ override fun getAvailabilityStatus(subId: Int): Int = when {
+ !Flags.isDualSimOnboardingEnabled() -> CONDITIONALLY_UNAVAILABLE
+ SubscriptionManager.isValidSubscriptionId(subId)-> AVAILABLE
+ else -> CONDITIONALLY_UNAVAILABLE
+ }
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ super.displayPreference(screen)
+ preference = screen.findPreference(preferenceKey)!!
+ }
+
+ override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ val viewModel by lazyViewModel
+
+ viewModel.subscriptionInfoListFlow
+ .collectLatestWithLifecycle(viewLifecycleOwner) { subscriptionInfoList ->
+ refreshData(subscriptionInfoList)
+ }
+ }
+
+ @VisibleForTesting
+ fun refreshData(subscriptionInfoList: List<SubscriptionInfo>){
+ spn = subscriptionInfoList
+ .firstOrNull { subInfo -> subInfo.subscriptionId == mSubId }
+ ?.let { info -> info.carrierName.toString() }
+ ?: String()
+
+ refreshUi()
+ }
+
+ private fun refreshUi(){
+ preference.summary = spn
+ }
+}
diff --git a/src/com/android/settings/nfc/NfcForegroundPreferenceController.java b/src/com/android/settings/nfc/NfcForegroundPreferenceController.java
index a4cad87..b036da2 100644
--- a/src/com/android/settings/nfc/NfcForegroundPreferenceController.java
+++ b/src/com/android/settings/nfc/NfcForegroundPreferenceController.java
@@ -16,6 +16,7 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.permission.flags.Flags;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
@@ -68,6 +69,9 @@
@Override
public int getAvailabilityStatus() {
+ if (Flags.walletRoleEnabled()) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
final PackageManager pm = mContext.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
return UNSUPPORTED_ON_DEVICE;
diff --git a/src/com/android/settings/notification/PoliteNotifWorkProfileToggleController.java b/src/com/android/settings/notification/PoliteNotifWorkProfileToggleController.java
index 65b4fb8..99d0a69 100644
--- a/src/com/android/settings/notification/PoliteNotifWorkProfileToggleController.java
+++ b/src/com/android/settings/notification/PoliteNotifWorkProfileToggleController.java
@@ -62,7 +62,7 @@
@Override
public boolean isChecked() {
return Settings.System.getIntForUser(mContext.getContentResolver(),
- Settings.System.NOTIFICATION_COOLDOWN_ENABLED, OFF, mManagedProfileId) != OFF;
+ Settings.System.NOTIFICATION_COOLDOWN_ENABLED, ON, mManagedProfileId) != OFF;
}
@Override
diff --git a/src/com/android/settings/privatespace/DeletePrivateSpaceController.java b/src/com/android/settings/privatespace/DeletePrivateSpaceController.java
deleted file mode 100644
index 98bf827..0000000
--- a/src/com/android/settings/privatespace/DeletePrivateSpaceController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2023 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.privatespace;
-
-import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
-import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
-import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NO_PRIVATE_SPACE;
-
-import android.content.Context;
-import android.text.TextUtils;
-import android.util.Log;
-import android.widget.Toast;
-
-import androidx.preference.Preference;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-
-/** Controller to delete the private space from the PS Settings page */
-public class DeletePrivateSpaceController extends BasePreferenceController {
- private static final String TAG = "DeletePrivateSpaceController";
- private final PrivateSpaceMaintainer mPrivateSpaceMaintainer;
-
- static class Injector {
- PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
- return PrivateSpaceMaintainer.getInstance(context);
- }
- }
-
- public DeletePrivateSpaceController(Context context, String preferenceKey) {
- this(context, preferenceKey, new Injector());
- }
-
- DeletePrivateSpaceController(Context context, String preferenceKey, Injector injector) {
- super(context, preferenceKey);
- mPrivateSpaceMaintainer = injector.injectPrivateSpaceMaintainer(context);
- }
-
- @Override
- public int getAvailabilityStatus() {
- return android.os.Flags.allowPrivateProfile() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
- return false;
- }
-
- PrivateSpaceMaintainer.ErrorDeletingPrivateSpace error =
- mPrivateSpaceMaintainer.deletePrivateSpace();
- if (error == DELETE_PS_ERROR_NONE) {
- showSuccessfulDeletionToast();
- } else if (error == DELETE_PS_ERROR_INTERNAL) {
- showDeletionInternalErrorToast();
- } else if (error == DELETE_PS_ERROR_NO_PRIVATE_SPACE) {
- // Ideally this should never happen as PS Settings is not available when there's no
- // Private Profile.
- Log.e(TAG, "Unexpected attempt to delete non-existent PS");
- }
- return super.handlePreferenceTreeClick(preference);
- }
-
- /** Shows a toast saying that the private space was deleted */
- @VisibleForTesting
- public void showSuccessfulDeletionToast() {
- Toast.makeText(mContext, R.string.private_space_deleted, Toast.LENGTH_SHORT).show();
- }
-
- /** Shows a toast saying that the private space could not be deleted */
- @VisibleForTesting
- public void showDeletionInternalErrorToast() {
- Toast.makeText(mContext, R.string.private_space_delete_failed, Toast.LENGTH_SHORT).show();
- }
-}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
index 8d68314..a283147 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -75,7 +75,8 @@
*
* <p> This method should be used by the Private Space Setup Flow ONLY.
*/
- final synchronized boolean createPrivateSpace() {
+ @VisibleForTesting
+ public final synchronized boolean createPrivateSpace() {
if (!Flags.allowPrivateProfile()) {
return false;
}
diff --git a/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java b/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java
new file mode 100644
index 0000000..af4535e
--- /dev/null
+++ b/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2023 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.privatespace.delete;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+
+import com.android.settings.core.BasePreferenceController;
+
+/** Controller to delete the private space from the PS Settings page */
+public class DeletePrivateSpaceController extends BasePreferenceController {
+ private static final String TAG = "PrivateSpaceDeleteCtrl";
+
+ public DeletePrivateSpaceController(@NonNull Context context, @NonNull String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return android.os.Flags.allowPrivateProfile() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(@NonNull Preference preference) {
+ if (mPreferenceKey.equals(preference.getKey())) {
+ startPrivateSpaceDeleteActivity();
+ return true;
+ }
+ return false;
+ }
+
+ private void startPrivateSpaceDeleteActivity() {
+ final Intent intent = new Intent(mContext, PrivateSpaceDeleteActivity.class);
+ mContext.startActivity(intent);
+ }
+}
diff --git a/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java
new file mode 100644
index 0000000..a4109b8
--- /dev/null
+++ b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java
@@ -0,0 +1,50 @@
+/*
+ * 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.privatespace.delete;
+
+import android.app.settings.SettingsEnums;
+import android.os.Bundle;
+
+import androidx.navigation.fragment.NavHostFragment;
+
+import com.android.settings.R;
+import com.android.settings.SetupWizardUtils;
+import com.android.settings.core.InstrumentedActivity;
+
+import com.google.android.setupdesign.util.ThemeHelper;
+
+public class PrivateSpaceDeleteActivity extends InstrumentedActivity {
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.PRIVATE_SPACE_SETTINGS;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ if (!android.os.Flags.allowPrivateProfile()) {
+ return;
+ }
+ setTheme(SetupWizardUtils.getTheme(this, getIntent()));
+ ThemeHelper.trySetDynamicColor(this);
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.privatespace_setup_root);
+ NavHostFragment navHostFragment =
+ (NavHostFragment)
+ getSupportFragmentManager().findFragmentById(R.id.ps_nav_host_fragment);
+ navHostFragment.getNavController().setGraph(R.navigation.private_space_delete_nav);
+ }
+}
diff --git a/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java
new file mode 100644
index 0000000..7dd3a5b
--- /dev/null
+++ b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2023 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.privatespace.delete;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.app.Activity;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.navigation.fragment.NavHostFragment;
+
+import com.android.settings.R;
+import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.privatespace.PrivateSpaceMaintainer;
+import com.android.settingslib.accounts.AuthenticatorHelper;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupdesign.GlifLayout;
+
+/** Fragment to delete private space that lists the accounts logged in to the private profile. */
+public class PrivateSpaceDeleteFragment extends InstrumentedFragment {
+ private static final String TAG = "PrivateSpaceDeleteFrag";
+ private View mContentView;
+ private static final int CREDENTIAL_CONFIRM_REQUEST = 1;
+ @Nullable private UserHandle mPrivateUserHandle;
+
+ @Override
+ public void onCreate(@Nullable Bundle icicle) {
+ if (android.os.Flags.allowPrivateProfile()) {
+ super.onCreate(icicle);
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (PrivateSpaceMaintainer.getInstance(getContext()).isPrivateSpaceLocked()) {
+ getActivity().finish();
+ }
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.PRIVATE_SPACE_SETTINGS;
+ }
+
+ private View.OnClickListener startAuthenticationForDelete() {
+ return v -> {
+ final ChooseLockSettingsHelper.Builder builder =
+ new ChooseLockSettingsHelper.Builder(getActivity(), this);
+ if (mPrivateUserHandle != null) {
+ builder.setRequestCode(CREDENTIAL_CONFIRM_REQUEST)
+ .setUserId(mPrivateUserHandle.getIdentifier())
+ .show();
+ } else {
+ Log.e(TAG, "Private space user handle cannot be null");
+ getActivity().finish();
+ }
+ };
+ }
+
+ @NonNull
+ @Override
+ public View onCreateView(
+ @NonNull LayoutInflater inflater,
+ @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ mPrivateUserHandle =
+ PrivateSpaceMaintainer.getInstance(getContext()).getPrivateProfileHandle();
+ if (mPrivateUserHandle == null) {
+ Log.e(TAG, "Private space user handle cannot be null");
+ getActivity().finish();
+ }
+ mContentView = inflater.inflate(R.layout.private_space_delete, container, false);
+ final GlifLayout layout = mContentView.findViewById(R.id.private_space_delete_layout);
+ final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
+ final Activity activity = getActivity();
+ mixin.setPrimaryButton(
+ new FooterButton.Builder(activity)
+ .setText(R.string.private_space_delete_button_label)
+ .setListener(startAuthenticationForDelete())
+ .setButtonType(FooterButton.ButtonType.OTHER)
+ .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
+ .build());
+ mixin.setSecondaryButton(
+ new FooterButton.Builder(activity)
+ .setText(android.R.string.cancel)
+ .setListener(view -> activity.onBackPressed())
+ .setButtonType(FooterButton.ButtonType.CANCEL)
+ .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
+ .build());
+
+ loadPrivateProfileAccountList();
+ return mContentView;
+ }
+
+ private void loadPrivateProfileAccountList() {
+ View accountsLabel = mContentView.findViewById(R.id.accounts_label);
+ LinearLayout contents = (LinearLayout) mContentView.findViewById(R.id.accounts);
+ contents.removeAllViews();
+
+ Context context = getActivity();
+
+ AccountManager accountManager = AccountManager.get(context);
+
+ LayoutInflater inflater = context.getSystemService(LayoutInflater.class);
+
+ final AuthenticatorHelper helper =
+ new AuthenticatorHelper(context, mPrivateUserHandle, null);
+ final String[] accountTypes = helper.getEnabledAccountTypes();
+
+ for (String type : accountTypes) {
+ final String accountType = type;
+ final Account[] accounts =
+ accountManager.getAccountsByTypeAsUser(accountType, mPrivateUserHandle);
+ Drawable icon = helper.getDrawableForType(getContext(), accountType);
+ if (icon == null) {
+ icon = context.getPackageManager().getDefaultActivityIcon();
+ }
+ for (Account account : accounts) {
+ View child = inflater.inflate(R.layout.main_clear_account, contents, false);
+ child.<ImageView>findViewById(android.R.id.icon).setImageDrawable(icon);
+ child.<TextView>findViewById(android.R.id.title).setText(account.name);
+ contents.addView(child);
+ }
+ }
+
+ if (contents.getChildCount() > 0) {
+ accountsLabel.setVisibility(View.VISIBLE);
+ contents.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == CREDENTIAL_CONFIRM_REQUEST && resultCode == Activity.RESULT_OK) {
+ NavHostFragment.findNavController(PrivateSpaceDeleteFragment.this)
+ .navigate(R.id.action_authenticate_delete);
+ }
+ }
+}
diff --git a/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java b/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java
new file mode 100644
index 0000000..3a16641
--- /dev/null
+++ b/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java
@@ -0,0 +1,143 @@
+/*
+ * 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.privatespace.delete;
+
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.privatespace.PrivateSpaceMaintainer;
+
+/** Fragment to show loading animation screen while deleting private space. */
+public class PrivateSpaceDeletionProgressFragment extends InstrumentedFragment {
+ private static final String TAG = "PrivateSpaceDeleteProg";
+ private static final int PRIVATE_SPACE_DELETE_POST_DELAY_MS = 1000;
+ private Handler mHandler;
+ private PrivateSpaceMaintainer mPrivateSpaceMaintainer;
+ private Runnable mDeletePrivateSpace =
+ new Runnable() {
+ @Override
+ public void run() {
+ deletePrivateSpace();
+ getActivity().finish();
+ }
+ };
+
+ static class Injector {
+ PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+ return PrivateSpaceMaintainer.getInstance(context);
+ }
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ if (android.os.Flags.allowPrivateProfile()) {
+ super.onCreate(savedInstanceState);
+ }
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.PRIVATE_SPACE_SETTINGS;
+ }
+
+ @NonNull
+ @Override
+ public View onCreateView(
+ @NonNull LayoutInflater inflater,
+ @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ mPrivateSpaceMaintainer =
+ new PrivateSpaceDeletionProgressFragment.Injector()
+ .injectPrivateSpaceMaintainer(getActivity().getApplicationContext());
+ if (!mPrivateSpaceMaintainer.doesPrivateSpaceExist()) {
+ // Ideally this should never happen as PS Settings is not available when there's no
+ // Private Profile.
+ Log.e(TAG, "Unexpected attempt to delete non-existent PS");
+ getActivity().finish();
+ }
+ View contentView =
+ inflater.inflate(R.layout.private_space_confirm_deletion, container, false);
+ OnBackPressedCallback callback =
+ new OnBackPressedCallback(true /* enabled by default */) {
+ @Override
+ public void handleOnBackPressed() {
+ // Handle the back button event. We intentionally don't want to allow back
+ // button to work in this screen during the setup flow.
+ }
+ };
+ requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
+ mHandler = new Handler(Looper.getMainLooper());
+ // Ensures screen visibility to user by introducing a 1-second delay before deleting private
+ // space.
+ mHandler.postDelayed(mDeletePrivateSpace, PRIVATE_SPACE_DELETE_POST_DELAY_MS);
+ return contentView;
+ }
+
+ @Override
+ public void onDestroy() {
+ mHandler.removeCallbacks(mDeletePrivateSpace);
+ super.onDestroy();
+ }
+
+ /** Deletes private space and shows a toast message */
+ @VisibleForTesting
+ public void deletePrivateSpace() {
+ PrivateSpaceMaintainer.ErrorDeletingPrivateSpace error =
+ mPrivateSpaceMaintainer.deletePrivateSpace();
+ if (error == DELETE_PS_ERROR_NONE) {
+ showSuccessfulDeletionToast();
+ } else if (error == DELETE_PS_ERROR_INTERNAL) {
+ showDeletionInternalErrorToast();
+ }
+ }
+
+ @VisibleForTesting
+ public void setPrivateSpaceMaintainer(@NonNull Injector injector) {
+ mPrivateSpaceMaintainer = injector.injectPrivateSpaceMaintainer(getActivity());
+ }
+
+ /** Shows a toast saying that the private space was deleted */
+ @VisibleForTesting
+ public void showSuccessfulDeletionToast() {
+ Toast.makeText(getContext(), R.string.private_space_deleted, Toast.LENGTH_SHORT).show();
+ }
+
+ /** Shows a toast saying that the private space could not be deleted */
+ @VisibleForTesting
+ public void showDeletionInternalErrorToast() {
+ Toast.makeText(getContext(), R.string.private_space_delete_failed, Toast.LENGTH_SHORT)
+ .show();
+ }
+}
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java
index d65b2d1..4544e73 100644
--- a/src/com/android/settings/sim/SimDialogActivity.java
+++ b/src/com/android/settings/sim/SimDialogActivity.java
@@ -41,6 +41,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.flags.Flags;
import com.android.settings.network.CarrierConfigCache;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.ims.WifiCallingQueryImsState;
@@ -134,6 +135,17 @@
return;
}
+ if (Flags.isDualSimOnboardingEnabled()
+ && getProgressState() == SubscriptionActionDialogActivity.PROGRESS_IS_SHOWING
+ && (dialogType == PREFERRED_PICK
+ || dialogType == DATA_PICK
+ || dialogType == CALLS_PICK
+ || dialogType == SMS_PICK)) {
+ Log.d(TAG, "Finish the sim dialog since the sim onboarding is shown");
+ finish();
+ return;
+ }
+
final String tag = Integer.toString(dialogType);
final FragmentManager fragmentManager = getSupportFragmentManager();
SimDialogFragment fragment = (SimDialogFragment) fragmentManager.findFragmentByTag(tag);
diff --git a/src/com/android/settings/spa/app/appinfo/AppButtonRepository.kt b/src/com/android/settings/spa/app/appinfo/AppButtonRepository.kt
index 5fa9436..b8019fb 100644
--- a/src/com/android/settings/spa/app/appinfo/AppButtonRepository.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppButtonRepository.kt
@@ -21,6 +21,7 @@
import android.content.Context
import android.content.om.OverlayManager
import android.content.pm.ApplicationInfo
+import android.content.pm.Flags
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.util.Log
@@ -95,7 +96,7 @@
isDisallowControl(app) -> return false
- uninstallDisallowedDueToHomeApp(app.packageName) -> return false
+ uninstallDisallowedDueToHomeApp(app) -> return false
// Resource overlays can be uninstalled iff they are public (installed on /data) and
// disabled. ("Enabled" means they are in use by resource management.)
@@ -113,7 +114,8 @@
* can go to Home settings and pick a different one, after which we'll permit uninstallation
* of the now-not-default one.
*/
- private fun uninstallDisallowedDueToHomeApp(packageName: String): Boolean {
+ fun uninstallDisallowedDueToHomeApp(applicationInfo: ApplicationInfo): Boolean {
+ val packageName = applicationInfo.packageName
val homePackageInfo = getHomePackageInfo()
return when {
packageName !in homePackageInfo.homePackages -> false
@@ -121,8 +123,17 @@
// Disallow uninstall when this is the only home app.
homePackageInfo.homePackages.size == 1 -> true
- // Disallow if this is the explicit default home app.
- else -> packageName == homePackageInfo.currentDefaultHome?.packageName
+ packageName == homePackageInfo.currentDefaultHome?.packageName -> {
+ if (Flags.improveHomeAppBehavior()) {
+ // Disallow the uninstallation of the current home app if it is a system app.
+ return applicationInfo.isSystemApp()
+ } else {
+ // Disallow if this is the explicit default home app.
+ return true
+ }
+ }
+
+ else -> false
}
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppButtons.kt b/src/com/android/settings/spa/app/appinfo/AppButtons.kt
index dcce1d9..3d9c4b1 100644
--- a/src/com/android/settings/spa/app/appinfo/AppButtons.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppButtons.kt
@@ -17,8 +17,8 @@
package com.android.settings.spa.app.appinfo
import android.content.pm.ApplicationInfo
-import android.content.pm.FeatureFlags
-import android.content.pm.FeatureFlagsImpl
+import android.content.pm.FeatureFlags as PmFeatureFlags
+import android.content.pm.FeatureFlagsImpl as PmFeatureFlagsImpl
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -34,7 +34,7 @@
fun AppButtons(
packageInfoPresenter: PackageInfoPresenter,
isHibernationSwitchEnabledStateFlow: MutableStateFlow<Boolean>,
- featureFlags: FeatureFlags = FeatureFlagsImpl()
+ featureFlags: PmFeatureFlags = PmFeatureFlagsImpl()
) {
if (remember(packageInfoPresenter) { packageInfoPresenter.isMainlineModule() }) return
val presenter = remember {
@@ -53,7 +53,7 @@
private class AppButtonsPresenter(
private val packageInfoPresenter: PackageInfoPresenter,
isHibernationSwitchEnabledStateFlow: MutableStateFlow<Boolean>,
- private val featureFlags: FeatureFlags
+ private val featureFlags: PmFeatureFlags
) {
private val appLaunchButton = AppLaunchButton(packageInfoPresenter)
private val appInstallButton = AppInstallButton(packageInfoPresenter)
diff --git a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt
index dba6184..695e114 100644
--- a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt
@@ -18,9 +18,8 @@
import android.app.settings.SettingsEnums
import android.content.pm.ApplicationInfo
-import android.content.pm.FeatureFlags
-import android.content.pm.FeatureFlagsImpl
import android.os.Bundle
+import android.os.SystemProperties
import android.os.UserHandle
import android.util.FeatureFlagUtils
import androidx.compose.runtime.Composable
@@ -51,6 +50,8 @@
import com.android.settingslib.spaprivileged.model.app.toRoute
import com.android.settingslib.spaprivileged.template.app.AppInfoProvider
import kotlinx.coroutines.flow.MutableStateFlow
+import android.content.pm.FeatureFlags as PmFeatureFlags
+import android.content.pm.FeatureFlagsImpl as PmFeatureFlagsImpl
private const val PACKAGE_NAME = "packageName"
private const val USER_ID = "userId"
@@ -121,7 +122,7 @@
@Composable
private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) {
val packageInfoState = packageInfoPresenter.flow.collectAsStateWithLifecycle()
- val featureFlags: FeatureFlags = FeatureFlagsImpl()
+ val featureFlags: PmFeatureFlags = PmFeatureFlagsImpl()
RegularScaffold(
title = stringResource(R.string.application_info_label),
actions = {
@@ -177,5 +178,6 @@
}
}
-fun isArchivingEnabled(featureFlags: FeatureFlags) =
- featureFlags.archiving() || "true" == System.getProperty("pm.archiving.enabled")
+fun isArchivingEnabled(featureFlags: PmFeatureFlags) =
+ featureFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
+ || Flags.appArchiving()
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
index 4f47266..86d7f44 100644
--- a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
@@ -22,8 +22,9 @@
import android.app.AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED
import android.content.Context
import android.content.pm.ApplicationInfo
-import android.content.pm.Flags
+import android.content.pm.Flags as PmFlags
import android.os.Build
+import android.os.SystemProperties
import android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM
import android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_UNKNOWN
import android.provider.DeviceConfig
@@ -36,6 +37,7 @@
import com.android.settings.R
import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED
import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS
+import com.android.settings.flags.Flags
import com.android.settingslib.spa.framework.compose.OverridableFlow
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
@@ -91,7 +93,8 @@
}
private fun isArchivingEnabled() =
- Flags.archiving() || "true" == System.getProperty("pm.archiving.enabled")
+ PmFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
+ || Flags.appArchiving()
private class HibernationSwitchPresenter(context: Context, private val app: ApplicationInfo) {
private val appOpsManager = context.appOpsManager
diff --git a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt
index 230ccb9..81abae5 100644
--- a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt
+++ b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt
@@ -20,14 +20,16 @@
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
-import android.content.pm.FeatureFlags
-import android.content.pm.FeatureFlagsImpl
+import android.content.pm.FeatureFlags as PmFeatureFlags
+import android.content.pm.FeatureFlagsImpl as PmFeatureFlagsImpl
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.os.UserHandle
import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable
+import com.android.settings.flags.FeatureFlags
+import com.android.settings.flags.FeatureFlagsImpl
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settings.spa.app.startUninstallActivity
import com.android.settingslib.spa.framework.compose.LocalNavController
@@ -60,7 +62,7 @@
val userId: Int,
private val coroutineScope: CoroutineScope,
private val packageManagers: IPackageManagers = PackageManagers,
- private val featureFlags: FeatureFlags = FeatureFlagsImpl(),
+ private val featureFlags: PmFeatureFlags = PmFeatureFlagsImpl(),
) {
private val metricsFeatureProvider = featureFactory.metricsFeatureProvider
private val userHandle = UserHandle.of(userId)
diff --git a/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt b/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt
index 3e48aa5..2b8d12d 100644
--- a/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt
+++ b/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt
@@ -27,7 +27,8 @@
import androidx.compose.runtime.Composable
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.R
-import com.android.settingslib.spa.livedata.observeAsCallback
+import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
+import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.model.app.PackageManagers
@@ -47,7 +48,7 @@
override val app: ApplicationInfo,
val isTrumped: Boolean,
val isChangeable: Boolean,
- var controller: AlarmsAndRemindersController,
+ var controller: AppOpsController,
) : AppRecord
class AlarmsAndRemindersAppListModel(
@@ -82,7 +83,7 @@
@Composable
override fun isAllowed(record: AlarmsAndRemindersAppRecord): () -> Boolean? = when {
record.isTrumped -> ({ true })
- else -> record.controller.isAllowed.observeAsCallback()
+ else -> record.controller.isAllowed.collectAsCallbackWithLifecycle()
}
override fun isChangeable(record: AlarmsAndRemindersAppRecord) = record.isChangeable
@@ -112,7 +113,12 @@
app = app,
isTrumped = isTrumped,
isChangeable = hasRequestPermission && !isTrumped,
- controller = AlarmsAndRemindersController(context, app),
+ controller = AppOpsController(
+ context = context,
+ app = app,
+ op = AppOpsManager.OP_SCHEDULE_EXACT_ALARM,
+ setModeByUid = true,
+ ),
)
}
diff --git a/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersController.kt b/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersController.kt
deleted file mode 100644
index bd40f45..0000000
--- a/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersController.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.spa.app.specialaccess
-
-import android.app.AppOpsManager
-import android.app.AppOpsManager.MODE_ALLOWED
-import android.app.AppOpsManager.MODE_ERRORED
-import android.content.Context
-import android.content.pm.ApplicationInfo
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.android.settingslib.spaprivileged.framework.common.alarmManager
-import com.android.settingslib.spaprivileged.framework.common.appOpsManager
-import com.android.settingslib.spaprivileged.model.app.userId
-
-class AlarmsAndRemindersController(
- context: Context,
- private val app: ApplicationInfo,
-) {
- private val alarmManager = context.alarmManager
- private val appOpsManager = context.appOpsManager
-
- val isAllowed: LiveData<Boolean>
- get() = _allowed
-
- fun setAllowed(allowed: Boolean) {
- val mode = if (allowed) MODE_ALLOWED else MODE_ERRORED
- appOpsManager.setUidMode(AppOpsManager.OP_SCHEDULE_EXACT_ALARM, app.uid, mode)
- _allowed.postValue(allowed)
- }
-
- private val _allowed = object : MutableLiveData<Boolean>() {
- override fun onActive() {
- postValue(alarmManager.hasScheduleExactAlarm(app.packageName, app.userId))
- }
- }
-}
diff --git a/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt b/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt
index dc98330..3e9058f 100644
--- a/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt
+++ b/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt
@@ -26,7 +26,7 @@
import android.os.UserManager
import androidx.compose.runtime.Composable
import com.android.settings.R
-import com.android.settingslib.spa.livedata.observeAsCallback
+import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.userId
@@ -81,7 +81,7 @@
@Composable
override fun isAllowed(record: InstallUnknownAppsRecord) =
- record.appOpsController.isAllowed.observeAsCallback()
+ record.appOpsController.isAllowed.collectAsCallbackWithLifecycle()
override fun isChangeable(record: InstallUnknownAppsRecord) =
isChangeable(record, getPotentialPackageNames(record.app.userId))
diff --git a/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt b/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt
index fe8f103..7885b86 100644
--- a/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt
+++ b/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt
@@ -27,7 +27,7 @@
import android.util.Log
import androidx.compose.runtime.Composable
import com.android.settings.R
-import com.android.settingslib.spa.livedata.observeAsCallback
+import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.installed
@@ -92,7 +92,7 @@
@Composable
override fun isAllowed(record: PictureInPictureRecord) =
- record.appOpsController.isAllowed.observeAsCallback()
+ record.appOpsController.isAllowed.collectAsCallbackWithLifecycle()
override fun isChangeable(record: PictureInPictureRecord) = record.isSupport
diff --git a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
index e746d4a..b6d83f2 100644
--- a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
+++ b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
@@ -67,6 +67,7 @@
import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
import com.android.settingslib.spaprivileged.template.preference.RestrictedPreference
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
@@ -171,6 +172,8 @@
.map { it.subscriptionId }
.firstOrNull() ?: SubscriptionManager.INVALID_SUBSCRIPTION_ID
}
+
+ Log.d(name, "defaultDataSubId: $defaultDataSubId, nonDds: $nonDds")
}
}
@@ -195,7 +198,6 @@
selectableSubscriptionInfoList
)
PrimarySimSectionImpl(
- subscriptionManager,
activeSubscriptionInfoList,
defaultVoiceSubId,
defaultSmsSubId,
@@ -257,12 +259,49 @@
@Composable
fun PrimarySimSectionImpl(
- subscriptionManager: SubscriptionManager?,
- activeSubscriptionInfoList: List<SubscriptionInfo>,
- callsSelectedId: MutableIntState,
- textsSelectedId: MutableIntState,
- mobileDataSelectedId: MutableIntState,
- nonDds: MutableIntState
+ subscriptionInfoList: List<SubscriptionInfo>,
+ callsSelectedId: MutableIntState,
+ textsSelectedId: MutableIntState,
+ mobileDataSelectedId: MutableIntState,
+ nonDds: MutableIntState,
+ subscriptionManager: SubscriptionManager? =
+ LocalContext.current.getSystemService(SubscriptionManager::class.java),
+ coroutineScope: CoroutineScope = rememberCoroutineScope(),
+ context: Context = LocalContext.current,
+ actionSetCalls: (Int) -> Unit = {
+ callsSelectedId.intValue = it
+ coroutineScope.launch {
+ setDefaultVoice(subscriptionManager, it)
+ }
+ },
+ actionSetTexts: (Int) -> Unit = {
+ textsSelectedId.intValue = it
+ coroutineScope.launch {
+ setDefaultSms(subscriptionManager, it)
+ }
+ },
+ actionSetMobileData: (Int) -> Unit = {
+ mobileDataSelectedId.intValue = it
+ coroutineScope.launch {
+ // TODO: to fix the WifiPickerTracker crash when create
+ // the wifiPickerTrackerHelper
+ setDefaultData(
+ context,
+ subscriptionManager,
+ null/*wifiPickerTrackerHelper*/,
+ it
+ )
+ }
+ },
+ actionSetAutoDataSwitch: (Boolean) -> Unit = { newState ->
+ coroutineScope.launch {
+ val telephonyManagerForNonDds: TelephonyManager? =
+ context.getSystemService(TelephonyManager::class.java)
+ ?.createForSubscriptionId(nonDds.intValue)
+ Log.d(NetworkCellularGroupProvider.name, "NonDds:${nonDds.intValue} setAutomaticData")
+ setAutomaticData(telephonyManagerForNonDds, newState)
+ }
+ },
) {
var state = rememberSaveable { mutableStateOf(false) }
var callsAndSmsList = remember {
@@ -272,11 +311,11 @@
mutableListOf(ListPreferenceOption(id = -1, text = "Loading"))
}
- if (activeSubscriptionInfoList.size >= 2) {
+ if (subscriptionInfoList.size >= 2) {
state.value = true
callsAndSmsList.clear()
dataList.clear()
- for (info in activeSubscriptionInfoList) {
+ for (info in subscriptionInfoList) {
var item = ListPreferenceOption(
id = info.subscriptionId,
text = "${info.displayName}"
@@ -291,12 +330,10 @@
} else {
// hide the primary sim
state.value = false
- Log.d("NetworkCellularGroupProvider", "Hide primary sim")
+ Log.d(NetworkCellularGroupProvider.name, "Hide primary sim")
}
if (state.value) {
- val coroutineScope = rememberCoroutineScope()
- var context = LocalContext.current
val telephonyManagerForNonDds: TelephonyManager? =
context.getSystemService(TelephonyManager::class.java)
?.createForSubscriptionId(nonDds.intValue)
@@ -305,44 +342,27 @@
}
Category(title = stringResource(id = R.string.primary_sim_title)) {
- createPrimarySimListPreference(
+ CreatePrimarySimListPreference(
stringResource(id = R.string.primary_sim_calls_title),
callsAndSmsList,
callsSelectedId,
ImageVector.vectorResource(R.drawable.ic_phone),
- ) {
- callsSelectedId.intValue = it
- coroutineScope.launch {
- setDefaultVoice(subscriptionManager, it)
- }
- }
- createPrimarySimListPreference(
+ actionSetCalls
+ )
+ CreatePrimarySimListPreference(
stringResource(id = R.string.primary_sim_texts_title),
callsAndSmsList,
textsSelectedId,
Icons.AutoMirrored.Outlined.Message,
- ) {
- textsSelectedId.intValue = it
- coroutineScope.launch {
- setDefaultSms(subscriptionManager, it)
- }
- }
- createPrimarySimListPreference(
+ actionSetTexts
+ )
+ CreatePrimarySimListPreference(
stringResource(id = R.string.mobile_data_settings_title),
dataList,
mobileDataSelectedId,
Icons.Outlined.DataUsage,
- ) {
- mobileDataSelectedId.intValue = it
- coroutineScope.launch {
- // TODO: to fix the WifiPickerTracker crash when create
- // the wifiPickerTrackerHelper
- setDefaultData(context,
- subscriptionManager,
- null/*wifiPickerTrackerHelper*/,
- it)
- }
- }
+ actionSetMobileData
+ )
}
val autoDataTitle = stringResource(id = R.string.primary_sim_automatic_data_title)
@@ -351,25 +371,18 @@
object : SwitchPreferenceModel {
override val title = autoDataTitle
override val summary = { autoDataSummary }
- override val changeable: () -> Boolean = {
- nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID
- }
override val checked = {
- coroutineScope.launch {
- withContext(Dispatchers.Default) {
- automaticDataChecked.value = telephonyManagerForNonDds != null
- && telephonyManagerForNonDds.isMobileDataPolicyEnabled(
- TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH)
+ if (nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ coroutineScope.launch {
+ automaticDataChecked.value = getAutomaticData(telephonyManagerForNonDds)
}
}
automaticDataChecked.value
}
- override val onCheckedChange: ((Boolean) -> Unit)? =
- { newChecked: Boolean ->
- coroutineScope.launch {
- setAutomaticData(telephonyManagerForNonDds, newChecked)
- }
- }
+ override val onCheckedChange: ((Boolean) -> Unit)? = {
+ automaticDataChecked.value = it
+ actionSetAutoDataSwitch(it)
+ }
}
})
}
@@ -428,19 +441,19 @@
return MobileNetworkUtils.showEuiccSettings(context)
}
-private suspend fun setDefaultVoice(
+suspend fun setDefaultVoice(
subscriptionManager: SubscriptionManager?,
subId: Int): Unit = withContext(Dispatchers.Default) {
subscriptionManager?.setDefaultVoiceSubscriptionId(subId)
}
-private suspend fun setDefaultSms(
+suspend fun setDefaultSms(
subscriptionManager: SubscriptionManager?,
subId: Int): Unit = withContext(Dispatchers.Default) {
subscriptionManager?.setDefaultSmsSubId(subId)
}
-private suspend fun setDefaultData(context: Context,
+suspend fun setDefaultData(context: Context,
subscriptionManager: SubscriptionManager?,
wifiPickerTrackerHelper: WifiPickerTrackerHelper?,
subId: Int): Unit = withContext(Dispatchers.Default) {
@@ -455,11 +468,22 @@
wifiPickerTrackerHelper.setCarrierNetworkEnabled(true)
}
}
+suspend fun getAutomaticData(telephonyManagerForNonDds: TelephonyManager?): Boolean =
+ withContext(Dispatchers.Default) {
+ telephonyManagerForNonDds != null
+ && telephonyManagerForNonDds.isMobileDataPolicyEnabled(
+ TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH)
+ }
-private suspend fun setAutomaticData(telephonyManager: TelephonyManager?, newState: Boolean): Unit =
- withContext(Dispatchers.Default) {
- telephonyManager?.setMobileDataPolicyEnabled(
- TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH,
- newState)
- //TODO: setup backup calling
- }
\ No newline at end of file
+suspend fun setAutomaticData(telephonyManager: TelephonyManager?, newState: Boolean): Unit =
+ withContext(Dispatchers.Default) {
+ Log.d(
+ "NetworkCellularGroupProvider",
+ "setAutomaticData: MOBILE_DATA_POLICY_AUTO_DATA_SWITCH as $newState"
+ )
+ telephonyManager?.setMobileDataPolicyEnabled(
+ TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH,
+ newState
+ )
+ //TODO: setup backup calling
+ }
\ No newline at end of file
diff --git a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
index 4cb04b6..e88c5c7 100644
--- a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
@@ -27,11 +27,9 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.android.settings.R
import com.android.settings.network.SimOnboardingService
-import com.android.settings.network.SubscriptionUtil
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.widget.dialog.AlertDialogButton
import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter
@@ -74,7 +72,7 @@
SettingsBody(stringResource(R.string.sim_onboarding_label_sim_msg))
}
- for (subInfo in onboardingService.getSelectableSubscriptionInfo()) {
+ for (subInfo in onboardingService.getSelectableSubscriptionInfoList()) {
var titleSimName by remember {
mutableStateOf(
onboardingService.getSubscriptionInfoDisplayName(subInfo)
diff --git a/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt b/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt
index e46dc2e..c60ac88 100644
--- a/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt
@@ -21,6 +21,7 @@
import android.content.Context
import android.content.ContextWrapper
import android.os.Bundle
+import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
@@ -31,12 +32,12 @@
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.android.settings.R
+import com.android.settings.network.SimOnboardingActivity
import com.android.settings.network.SimOnboardingService
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
-
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -59,7 +60,7 @@
private val owner = createSettingsPage()
@VisibleForTesting
- var onboardingService: SimOnboardingService = SimOnboardingService()
+ var onboardingService: SimOnboardingService = SimOnboardingActivity.onboardingService
fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner = owner)
.setUiLayoutFn {
@@ -72,18 +73,12 @@
@Composable
override fun Page(arguments: Bundle?) {
- initServiceData(arguments!!.getInt(SUB_ID))
PageImpl(onboardingService,rememberNavController())
}
fun getRoute(
subId: Int
): String = "${name}/$subId"
-
- @Composable
- fun initServiceData(targetSubId: Int) {
- onboardingService.initData(targetSubId, LocalContext.current)
- }
}
private fun Context.getActivity(): Activity? = when (this) {
@@ -95,7 +90,10 @@
@Composable
fun PageImpl(onboardingService:SimOnboardingService,navHostController: NavHostController) {
val context = LocalContext.current
- var previousPageOfOnboarding: () -> Unit = { context.getActivity()?.finish() }
+ var finishOnboarding: () -> Unit = {
+ context.getActivity()?.finish()
+ onboardingService.callback(SimOnboardingActivity.CALLBACK_FINISH)
+ }
NavHost(
navController = navHostController,
@@ -103,31 +101,32 @@
) {
composable(route = SimOnboardingScreen.LabelSim.name) {
val nextPage =
- // Adding more conditions
- if (onboardingService.isMultipleEnabledProfilesSupported) {
+ if (onboardingService.isMultipleEnabledProfilesSupported && onboardingService.isAllOfSlotAssigned) {
SimOnboardingScreen.SelectSim.name
} else {
+ onboardingService.addCurrentItemForSelectedSim()
SimOnboardingScreen.PrimarySim.name
}
SimOnboardingLabelSimImpl(
nextAction = { navHostController.navigate(nextPage) },
- cancelAction = previousPageOfOnboarding,
+ cancelAction = finishOnboarding,
onboardingService = onboardingService
)
}
composable(route = SimOnboardingScreen.PrimarySim.name) {
SimOnboardingPrimarySimImpl(
nextAction = {
- //go back and activate sim
+ onboardingService.callback(SimOnboardingActivity.CALLBACK_ONBOARDING_COMPLETE)
+ context.getActivity()?.finish()
},
- cancelAction = previousPageOfOnboarding,
+ cancelAction = finishOnboarding,
onboardingService = onboardingService
)
}
composable(route = SimOnboardingScreen.SelectSim.name) {
SimOnboardingSelectSimImpl(
nextAction = { navHostController.navigate(SimOnboardingScreen.PrimarySim.name) },
- cancelAction = previousPageOfOnboarding,
+ cancelAction = finishOnboarding,
onboardingService = onboardingService
)
}
diff --git a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
index 5752a4f..999abb4 100644
--- a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
@@ -16,32 +16,25 @@
package com.android.settings.spa.network
+import android.telephony.SubscriptionManager
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.automirrored.outlined.Message
-import androidx.compose.material.icons.outlined.DataUsage
import androidx.compose.material.icons.outlined.SignalCellularAlt
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableIntState
-import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
-import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.res.vectorResource
import com.android.settings.R
import com.android.settings.network.SimOnboardingService
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.widget.preference.ListPreference
import com.android.settingslib.spa.widget.preference.ListPreferenceModel
import com.android.settingslib.spa.widget.preference.ListPreferenceOption
-import com.android.settingslib.spa.widget.preference.SwitchPreference
-import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.settingslib.spa.widget.scaffold.BottomAppBarButton
import com.android.settingslib.spa.widget.scaffold.SuwScaffold
import com.android.settingslib.spa.widget.ui.SettingsBody
@@ -68,84 +61,54 @@
cancelAction
),
) {
- primarySimBody(onboardingService)
- }
-}
-
-@Composable
-private fun primarySimBody(onboardingService: SimOnboardingService) {
- //TODO: Load the status from the frameworks
- var callsSelectedId = rememberSaveable { mutableIntStateOf(1) }
- var textsSelectedId = rememberSaveable { mutableIntStateOf(1) }
- var mobileDataSelectedId = rememberSaveable { mutableIntStateOf(1) }
- var automaticDataChecked by rememberSaveable { mutableStateOf(true) }
-
- Column(Modifier.padding(SettingsDimension.itemPadding)) {
- SettingsBody(stringResource(id = R.string.sim_onboarding_primary_sim_msg))
- }
- var selectableSubscriptionInfo = onboardingService.getSelectableSubscriptionInfo()
- var list = listOf(ListPreferenceOption(id = -1, text = "Loading"))
- if (selectableSubscriptionInfo.size >= 2) {
- list = listOf(
- ListPreferenceOption(
- id = selectableSubscriptionInfo[0].subscriptionId,
- text = "${selectableSubscriptionInfo[0].displayName}"
- ),
- ListPreferenceOption(
- id = selectableSubscriptionInfo[1].subscriptionId,
- text = "${selectableSubscriptionInfo[1].displayName}"
- ),
- ListPreferenceOption(
- id = -1,
- text = stringResource(id = R.string.sim_calls_ask_first_prefs_title)
- ),
- )
- } else {
- // set all of primary sim items' enable as false and showing that sim.
- }
- createPrimarySimListPreference(
- stringResource(id = R.string.primary_sim_calls_title),
- list,
- callsSelectedId,
- ImageVector.vectorResource(R.drawable.ic_phone),
- onIdSelected = { callsSelectedId.intValue = it }
- )
- createPrimarySimListPreference(
- stringResource(id = R.string.primary_sim_texts_title),
- list,
- textsSelectedId,
- Icons.AutoMirrored.Outlined.Message,
- onIdSelected = { textsSelectedId.intValue = it }
- )
-
- createPrimarySimListPreference(
- stringResource(id = R.string.mobile_data_settings_title),
- list,
- mobileDataSelectedId,
- Icons.Outlined.DataUsage,
- onIdSelected = { mobileDataSelectedId.intValue = it }
- )
-
- val autoDataTitle = stringResource(id = R.string.primary_sim_automatic_data_title)
- val autoDataSummary = stringResource(id = R.string.primary_sim_automatic_data_msg)
- SwitchPreference(remember {
- object : SwitchPreferenceModel {
- override val title = autoDataTitle
- override val summary = { autoDataSummary }
- override val checked = { automaticDataChecked }
- override val onCheckedChange =
- { newChecked: Boolean -> automaticDataChecked = newChecked }
+ val callsSelectedId = rememberSaveable {
+ mutableIntStateOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
}
- })
+ val textsSelectedId = rememberSaveable {
+ mutableIntStateOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+ }
+ val mobileDataSelectedId = rememberSaveable {
+ mutableIntStateOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+ }
+ val nonDdsRemember = rememberSaveable {
+ mutableIntStateOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+ }
+
+ Column(Modifier.padding(SettingsDimension.itemPadding)) {
+ SettingsBody(stringResource(id = R.string.sim_onboarding_primary_sim_msg))
+ }
+
+ var selectedSubscriptionInfoList = onboardingService.getSelectedSubscriptionInfoList()
+ callsSelectedId.intValue = onboardingService.targetPrimarySimCalls
+ textsSelectedId.intValue = onboardingService.targetPrimarySimTexts
+ mobileDataSelectedId.intValue = onboardingService.targetPrimarySimMobileData
+ PrimarySimSectionImpl(
+ subscriptionInfoList = selectedSubscriptionInfoList,
+ callsSelectedId = callsSelectedId,
+ textsSelectedId = textsSelectedId,
+ mobileDataSelectedId = mobileDataSelectedId,
+ nonDds = nonDdsRemember,
+ actionSetCalls = {
+ callsSelectedId.intValue = it
+ onboardingService.targetPrimarySimCalls = it},
+ actionSetTexts = {
+ textsSelectedId.intValue = it
+ onboardingService.targetPrimarySimTexts = it},
+ actionSetMobileData = {
+ mobileDataSelectedId.intValue = it
+ onboardingService.targetPrimarySimMobileData = it},
+ actionSetAutoDataSwitch = {
+ onboardingService.targetPrimarySimAutoDataSwitch = it},
+ )
+ }
}
@Composable
-fun createPrimarySimListPreference(
+fun CreatePrimarySimListPreference(
title: String,
list: List<ListPreferenceOption>,
selectedId: MutableIntState,
icon: ImageVector,
- enable: Boolean = true,
onIdSelected: (id: Int) -> Unit
) = ListPreference(remember {
object : ListPreferenceModel {
@@ -156,7 +119,5 @@
override val icon = @Composable {
SettingsIcon(icon)
}
- override val enabled: () -> Boolean
- get() = { enable }
}
})
\ No newline at end of file
diff --git a/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt b/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt
index 1955d13..5e71b12 100644
--- a/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt
@@ -16,24 +16,23 @@
package com.android.settings.spa.network
+import android.util.Log
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.SignalCellularAlt
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.android.settings.R
import com.android.settings.network.SimOnboardingService
+import com.android.settings.sim.SimDialogActivity
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.widget.preference.CheckboxPreference
import com.android.settingslib.spa.widget.preference.CheckboxPreferenceModel
-
import com.android.settingslib.spa.widget.scaffold.BottomAppBarButton
import com.android.settingslib.spa.widget.scaffold.SuwScaffold
import com.android.settingslib.spa.widget.ui.SettingsBody
@@ -68,22 +67,38 @@
Column(Modifier.padding(SettingsDimension.itemPadding)) {
SettingsBody(stringResource(id = R.string.sim_onboarding_select_sim_msg))
}
- for (subInfo in onboardingService.getSelectableSubscriptionInfo()) {
+ var isFinished = rememberSaveable { mutableStateOf(false) }
+ isFinished.value = onboardingService.isSimSelectionFinished
+ for (subInfo in onboardingService.getSelectableSubscriptionInfoList()) {
var title = onboardingService.getSubscriptionInfoDisplayName(subInfo)
var summaryNumber =
subInfo.number // TODO using the SubscriptionUtil.getFormattedPhoneNumber
- var changeable = subInfo.isActive
- var checked by rememberSaveable { mutableStateOf(!subInfo.isActive) }
+ var checked = rememberSaveable {
+ mutableStateOf(
+ onboardingService.getSelectedSubscriptionInfoList().contains(subInfo)
+ )
+ }
CheckboxPreference(remember {
object : CheckboxPreferenceModel {
override val title = title
override val summary: () -> String
get() = { summaryNumber }
- override val checked = { checked }
- override val changeable = { changeable }
- override val onCheckedChange = { newChecked: Boolean -> checked = newChecked }
+ override val checked = { checked.value }
+ override val onCheckedChange = { newChecked: Boolean ->
+ checked.value = newChecked
+ if (newChecked) {
+ onboardingService.addItemForSelectedSim(subInfo)
+ } else {
+ onboardingService.removeItemForSelectedSim(subInfo)
+ }
+ isFinished.value = onboardingService.isSimSelectionFinished
+ }
+ override val changeable = {
+ subInfo.isActive
+ && (!isFinished.value || (isFinished.value && checked.value))
+ }
}
})
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index a758e34..a030d86 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -476,9 +476,12 @@
private void enableCallsAndSms(boolean enabled) {
mPhonePref.setChecked(enabled);
- UserHandle userHandle = UserHandle.of(mUserInfo.id);
- mUserManager.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, !enabled, userHandle);
- mUserManager.setUserRestriction(UserManager.DISALLOW_SMS, !enabled, userHandle);
+ int[] userProfiles = mUserManager.getProfileIdsWithDisabled(mUserInfo.id);
+ for (int userId : userProfiles) {
+ UserHandle user = UserHandle.of(userId);
+ mUserManager.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, !enabled, user);
+ mUserManager.setUserRestriction(UserManager.DISALLOW_SMS, !enabled, user);
+ }
}
/**
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index d39d980..70d8ed3 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -1771,6 +1771,9 @@
.updateNonIndexableKeys(niks);
new AutoSyncWorkDataPreferenceController(context, null /* parent */)
.updateNonIndexableKeys(niks);
+ if (suppressAllPage) {
+ niks.add(KEY_ALLOW_MULTIPLE_USERS);
+ }
return niks;
}
};
diff --git a/src/com/android/settings/widget/CardPreference.java b/src/com/android/settings/widget/CardPreference.java
deleted file mode 100644
index 61114d9..0000000
--- a/src/com/android/settings/widget/CardPreference.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-import com.google.android.material.card.MaterialCardView;
-
-import java.util.Optional;
-
-/** Preference that wrapped by {@link MaterialCardView} */
-public class CardPreference extends Preference {
-
- private View.OnClickListener mPrimaryBtnClickListener = null;
- private View.OnClickListener mSecondaryBtnClickListener = null;
-
- private String mPrimaryButtonText = null;
- private String mSecondaryButtonText = null;
-
- private Optional<Button> mPrimaryButton = Optional.empty();
- private Optional<Button> mSecondaryButton = Optional.empty();
- private Optional<View> mButtonsGroup = Optional.empty();
-
- private boolean mPrimaryButtonVisible = false;
- private boolean mSecondaryButtonVisible = false;
-
- public CardPreference(Context context) {
- this(context, null /* attrs */);
- }
-
- public CardPreference(Context context, AttributeSet attrs) {
- super(context, attrs, R.attr.cardPreferenceStyle);
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
-
- initButtonsAndLayout(holder);
- }
-
- private void initButtonsAndLayout(PreferenceViewHolder holder) {
- mPrimaryButton = Optional.ofNullable((Button) holder.findViewById(android.R.id.button1));
- mSecondaryButton = Optional.ofNullable((Button) holder.findViewById(android.R.id.button2));
- mButtonsGroup = Optional.ofNullable(holder.findViewById(R.id.card_preference_buttons));
-
- setPrimaryButtonText(mPrimaryButtonText);
- setPrimaryButtonClickListener(mPrimaryBtnClickListener);
- setPrimaryButtonVisible(mPrimaryButtonVisible);
- setSecondaryButtonText(mSecondaryButtonText);
- setSecondaryButtonClickListener(mSecondaryBtnClickListener);
- setSecondaryButtonVisible(mSecondaryButtonVisible);
- }
-
- /** Clear layout state if needed */
- public void resetLayoutState() {
- setPrimaryButtonVisible(false);
- setSecondaryButtonVisible(false);
- }
-
- /**
- * Register a callback to be invoked when the primary button is clicked.
- *
- * @param l the callback that will run
- */
- public void setPrimaryButtonClickListener(View.OnClickListener l) {
- mPrimaryButton.ifPresent(button -> button.setOnClickListener(l));
- mPrimaryBtnClickListener = l;
- }
-
- /**
- * Register a callback to be invoked when the secondary button is clicked.
- *
- * @param l the callback that will run
- */
- public void setSecondaryButtonClickListener(View.OnClickListener l) {
- mSecondaryButton.ifPresent(button -> button.setOnClickListener(l));
- mSecondaryBtnClickListener = l;
- }
-
- /**
- * Sets the text to be displayed on primary button.
- *
- * @param text text to be displayed
- */
- public void setPrimaryButtonText(String text) {
- mPrimaryButton.ifPresent(button -> button.setText(text));
- mPrimaryButtonText = text;
- }
-
- /**
- * Sets the text to be displayed on secondary button.
- *
- * @param text text to be displayed
- */
- public void setSecondaryButtonText(String text) {
- mSecondaryButton.ifPresent(button -> button.setText(text));
- mSecondaryButtonText = text;
- }
-
- /**
- * Set the visible on the primary button.
- *
- * @param visible {@code true} for visible
- */
- public void setPrimaryButtonVisible(boolean visible) {
- mPrimaryButton.ifPresent(
- button -> button.setVisibility(visible ? View.VISIBLE : View.GONE));
- mPrimaryButtonVisible = visible;
- updateButtonGroupsVisibility();
- }
-
- /**
- * Set the visible on the secondary button.
- *
- * @param visible {@code true} for visible
- */
- public void setSecondaryButtonVisible(boolean visible) {
- mSecondaryButton.ifPresent(
- button -> button.setVisibility(visible ? View.VISIBLE : View.GONE));
- mSecondaryButtonVisible = visible;
- updateButtonGroupsVisibility();
- }
-
- /**
- * Sets the text of content description on primary button.
- *
- * @param text text for the content description
- */
- public void setPrimaryButtonContentDescription(String text) {
- mPrimaryButton.ifPresent(button -> button.setContentDescription(text));
- }
-
- /**
- * Sets the text of content description on secondary button.
- *
- * @param text text for the content description
- */
- public void setSecondaryButtonContentDescription(String text) {
- mSecondaryButton.ifPresent(button -> button.setContentDescription(text));
- }
-
- private void updateButtonGroupsVisibility() {
- int visibility =
- (mPrimaryButtonVisible || mSecondaryButtonVisible) ? View.VISIBLE : View.GONE;
- mButtonsGroup.ifPresent(group -> group.setVisibility(visibility));
- }
-}
diff --git a/src/com/android/settings/widget/CardPreference.kt b/src/com/android/settings/widget/CardPreference.kt
new file mode 100644
index 0000000..7122ac6
--- /dev/null
+++ b/src/com/android/settings/widget/CardPreference.kt
@@ -0,0 +1,119 @@
+/*
+ * 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.widget
+
+import android.content.Context
+import android.content.res.Resources
+import android.util.AttributeSet
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.res.vectorResource
+import com.android.settings.spa.preference.ComposePreference
+import com.android.settingslib.spa.widget.card.CardButton
+import com.android.settingslib.spa.widget.card.CardModel
+import com.android.settingslib.spa.widget.card.SettingsCard
+
+/** A preference for settings banner tips card. */
+class CardPreference
+@JvmOverloads
+constructor(
+ context: Context,
+ attr: AttributeSet? = null,
+) : ComposePreference(context, attr) {
+
+ /** A icon resource id for displaying icon on tips card. */
+ var iconResId: Int? = null
+
+ /** The primary button's text. */
+ var primaryButtonText: String = ""
+
+ /** The accessibility content description of the primary button. */
+ var primaryButtonContentDescription: String? = null
+
+ /** The action for click on primary button. */
+ var primaryButtonAction: () -> Unit = {}
+
+ /** The visibility of primary button on tips card. The default value is `false`. */
+ var primaryButtonVisibility: Boolean = false
+
+ /** The text on the second button of this [SettingsCard]. */
+ var secondaryButtonText: String = ""
+
+ /** The accessibility content description of the secondary button. */
+ var secondaryButtonContentDescription: String? = null
+
+ /** The action for click on secondary button. */
+ var secondaryButtonAction: () -> Unit = {}
+
+ /** The visibility of secondary button on tips card. The default value is `false`. */
+ var secondaryButtonVisibility: Boolean = false
+
+ private var onDismiss: (() -> Unit)? = null
+
+ /** Enable the dismiss button on tips card. */
+ fun enableDismiss(enable: Boolean) =
+ if (enable) onDismiss = { isVisible = false } else onDismiss = null
+
+ /** Clear layout state if needed. */
+ fun resetLayoutState() {
+ primaryButtonVisibility = false
+ secondaryButtonVisibility = false
+ notifyChanged()
+ }
+
+ /** Build the tips card content to apply any changes of this card's property. */
+ fun buildContent() {
+ setContent {
+ SettingsCard(
+ CardModel(
+ title = title?.toString() ?: "",
+ text = summary?.toString() ?: "",
+ buttons = listOfNotNull(configPrimaryButton(), configSecondaryButton()),
+ onDismiss = onDismiss,
+ imageVector =
+ iconResId
+ ?.takeIf { it != Resources.ID_NULL }
+ ?.let { ImageVector.vectorResource(it) },
+ )
+ )
+ }
+ }
+
+ private fun configPrimaryButton(): CardButton? {
+ return if (primaryButtonVisibility)
+ CardButton(
+ text = primaryButtonText,
+ contentDescription = primaryButtonContentDescription,
+ onClick = primaryButtonAction,
+ )
+ else null
+ }
+
+ private fun configSecondaryButton(): CardButton? {
+ return if (secondaryButtonVisibility)
+ CardButton(
+ text = secondaryButtonText,
+ contentDescription = secondaryButtonContentDescription,
+ onClick = secondaryButtonAction,
+ )
+ else null
+ }
+
+ override fun notifyChanged() {
+ buildContent()
+ super.notifyChanged()
+ }
+}
diff --git a/src/com/android/settings/wifi/WifiScanModeActivity.java b/src/com/android/settings/wifi/WifiScanModeActivity.java
index c10ee27..446891a 100644
--- a/src/com/android/settings/wifi/WifiScanModeActivity.java
+++ b/src/com/android/settings/wifi/WifiScanModeActivity.java
@@ -39,26 +39,24 @@
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.wifi.WifiPermissionChecker;
-/**
- * This activity requests users permission to allow scanning even when Wi-Fi is turned off
- */
+/** This activity requests users permission to allow scanning even when Wi-Fi is turned off */
public class WifiScanModeActivity extends FragmentActivity {
private static final String TAG = "WifiScanModeActivity";
private DialogFragment mDialog;
- @VisibleForTesting
- String mApp;
- @VisibleForTesting
- WifiPermissionChecker mWifiPermissionChecker;
+ @VisibleForTesting String mApp;
+ @VisibleForTesting WifiPermissionChecker mWifiPermissionChecker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- getWindow().addSystemFlags(
- WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ getWindow()
+ .addSystemFlags(
+ WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
Intent intent = getIntent();
if (savedInstanceState == null) {
- if (intent != null && WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
- .equals(intent.getAction())) {
+ if (intent != null
+ && WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE.equals(
+ intent.getAction())) {
refreshAppLabel();
} else {
finish();
@@ -92,6 +90,12 @@
return;
}
+ if (!isWifiScanModeConfigAllowed(getApplicationContext())) {
+ Log.e(TAG, "This user is not allowed to configure Wi-Fi Scan Mode!");
+ finish();
+ return;
+ }
+
if (mDialog == null) {
mDialog = AlertDialogFragment.newInstance(mApp);
mDialog.show(getSupportFragmentManager(), "dialog");
@@ -140,6 +144,7 @@
}
private final String mApp;
+
public AlertDialogFragment(String app) {
super();
mApp = app;
@@ -158,25 +163,27 @@
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
- .setMessage(TextUtils.isEmpty(mApp) ?
- getString(R.string.wifi_scan_always_turn_on_message_unknown) :
- getString(R.string.wifi_scan_always_turnon_message, mApp))
- .setPositiveButton(R.string.wifi_scan_always_confirm_allow,
+ .setMessage(
+ TextUtils.isEmpty(mApp)
+ ? getString(R.string.wifi_scan_always_turn_on_message_unknown)
+ : getString(R.string.wifi_scan_always_turnon_message, mApp))
+ .setPositiveButton(
+ R.string.wifi_scan_always_confirm_allow,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((WifiScanModeActivity) getActivity()).doPositiveClick();
}
- }
- )
- .setNegativeButton(R.string.wifi_scan_always_confirm_deny,
+ })
+ .setNegativeButton(
+ R.string.wifi_scan_always_confirm_deny,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((WifiScanModeActivity) getActivity()).doNegativeClick();
}
- }
- )
+ })
.create();
}
+
@Override
public void onCancel(DialogInterface dialog) {
((WifiScanModeActivity) getActivity()).doNegativeClick();
@@ -184,9 +191,14 @@
}
private static boolean isGuestUser(Context context) {
- if (context == null) return false;
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) return false;
return userManager.isGuestUser();
}
+
+ private static boolean isWifiScanModeConfigAllowed(Context context) {
+ final UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager == null) return true;
+ return !userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_LOCATION);
+ }
}
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index a90d627..82537d4 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -27,6 +27,7 @@
import android.os.Bundle;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
@@ -49,6 +50,7 @@
import com.android.ims.ImsConfig;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.Flags;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
@@ -97,6 +99,7 @@
private boolean mEditableWfcMode = true;
private boolean mEditableWfcRoamingMode = true;
private boolean mUseWfcHomeModeForRoaming = false;
+ private boolean mOverrideWfcRoamingModeWhileUsingNtn = false;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private ImsMmTelManager mImsMmTelManager;
@@ -166,7 +169,8 @@
final Preference pref_roam =
getPreferenceScreen().findPreference(BUTTON_WFC_ROAMING_MODE);
if (pref_roam != null) {
- pref_roam.setEnabled(isWfcRoamingModeEditable);
+ pref_roam.setEnabled(isWfcRoamingModeEditable
+ && !overrideWfcRoamingModeWhileUsingNtn());
}
}
}
@@ -361,6 +365,9 @@
false);
isWifiOnlySupported = b.getBoolean(
CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, true);
+ mOverrideWfcRoamingModeWhileUsingNtn = b.getBoolean(
+ CarrierConfigManager.KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL,
+ true);
}
}
@@ -577,7 +584,8 @@
mButtonWfcMode.setSummary(getWfcModeSummary(wfcMode));
mButtonWfcMode.setEnabled(wfcEnabled && mEditableWfcMode);
// mButtonWfcRoamingMode.setSummary is not needed; summary is just selected value.
- mButtonWfcRoamingMode.setEnabled(wfcEnabled && mEditableWfcRoamingMode);
+ mButtonWfcRoamingMode.setEnabled(wfcEnabled && mEditableWfcRoamingMode
+ && !overrideWfcRoamingModeWhileUsingNtn());
final PreferenceScreen preferenceScreen = getPreferenceScreen();
final boolean updateAddressEnabled = (getCarrierActivityIntent() != null);
@@ -711,4 +719,30 @@
}
mProvisioningManager.unregisterProvisioningChangedCallback(mProvisioningCallback);
}
+
+ /**
+ * Determine whether to override roaming Wi-Fi calling preference when device is connected to
+ * non-terrestrial network.
+ *
+ * @return {@code true} if phone is connected to non-terrestrial network and if
+ * {@link CarrierConfigManager#KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL} is true,
+ * {@code false} otherwise.
+ */
+ private boolean overrideWfcRoamingModeWhileUsingNtn() {
+ if (!Flags.carrierEnabledSatelliteFlag()) {
+ return false;
+ }
+
+ TelephonyManager tm = getTelephonyManagerForSub(mSubId);
+ ServiceState serviceState = tm.getServiceState();
+ if (serviceState == null) {
+ return false;
+ }
+
+ if (!serviceState.isUsingNonTerrestrialNetwork()) {
+ return false;
+ }
+
+ return mOverrideWfcRoamingModeWhileUsingNtn;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
index 54c2d6e..6fc01fc 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
@@ -23,6 +23,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
@@ -38,15 +39,18 @@
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.om.OverlayInfo;
import android.content.om.OverlayManager;
import android.content.pm.ApplicationInfo;
+import android.content.pm.Flags;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.os.UserManager;
+import android.platform.test.annotations.RequiresFlagsEnabled;
import android.util.ArraySet;
import android.view.View;
@@ -107,7 +111,7 @@
@Mock
private OverlayManager mOverlayManager;
@Mock
- private PackageManager mPackageManger;
+ private PackageManager mPackageManager;
@Mock
private DevicePolicyManager mDpm;
@Mock
@@ -132,7 +136,7 @@
mContext = RuntimeEnvironment.application;
doReturn(mDpm).when(mSettingsActivity).getSystemService(Context.DEVICE_POLICY_SERVICE);
doReturn(mUserManager).when(mSettingsActivity).getSystemService(Context.USER_SERVICE);
- doReturn(mPackageManger).when(mSettingsActivity).getPackageManager();
+ doReturn(mPackageManager).when(mSettingsActivity).getPackageManager();
doReturn(mAm).when(mSettingsActivity).getSystemService(Context.ACTIVITY_SERVICE);
doReturn(mOverlayManager).when(mSettingsActivity).
getSystemService(OverlayManager.class);
@@ -184,7 +188,7 @@
@Test
public void retrieveAppEntry_hasAppEntry_notNull()
throws PackageManager.NameNotFoundException {
- doReturn(mPackageInfo).when(mPackageManger).getPackageInfo(anyString(), anyInt());
+ doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(anyString(), anyInt());
mController.retrieveAppEntry();
@@ -195,7 +199,7 @@
@Test
public void retrieveAppEntry_noAppEntry_null() throws PackageManager.NameNotFoundException {
doReturn(null).when(mState).getEntry(eq(PACKAGE_NAME), anyInt());
- doReturn(mPackageInfo).when(mPackageManger).getPackageInfo(anyString(), anyInt());
+ doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(anyString(), anyInt());
mController.retrieveAppEntry();
@@ -207,7 +211,7 @@
public void retrieveAppEntry_throwException_null() throws
PackageManager.NameNotFoundException {
doReturn(mAppEntry).when(mState).getEntry(anyString(), anyInt());
- doThrow(new PackageManager.NameNotFoundException()).when(mPackageManger).getPackageInfo(
+ doThrow(new PackageManager.NameNotFoundException()).when(mPackageManager).getPackageInfo(
anyString(), anyInt());
mController.retrieveAppEntry();
@@ -225,7 +229,7 @@
@Test
public void updateOpenButton_haveLaunchIntent_buttonShouldBeEnable() {
- doReturn(new Intent()).when(mPackageManger).getLaunchIntentForPackage(anyString());
+ doReturn(new Intent()).when(mPackageManager).getLaunchIntentForPackage(anyString());
mController.updateOpenButton();
@@ -347,6 +351,35 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_IMPROVE_HOME_APP_BEHAVIOR)
+ public void updateUninstallButton_isNotSystemAndIsCurrentHomeAndHasOneHome_setButtonDisable() {
+ doReturn(false).when(mController).isSystemPackage(any(), any(), any());
+ doReturn(new ComponentName(PACKAGE_NAME, "cls")).when(mPackageManager).getHomeActivities(
+ anyList());
+
+ mController.mHomePackages.add(PACKAGE_NAME);
+
+ mController.updateUninstallButton();
+
+ verify(mButtonPrefs).setButton2Enabled(false);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_IMPROVE_HOME_APP_BEHAVIOR)
+ public void updateUninstallButton_isNotSystemAndIsCurrentHomeAndHasOtherHome_setButtonEnable() {
+ doReturn(false).when(mController).isSystemPackage(any(), any(), any());
+ doReturn(new ComponentName(PACKAGE_NAME, "cls")).when(mPackageManager).getHomeActivities(
+ anyList());
+
+ mController.mHomePackages.add(PACKAGE_NAME);
+ mController.mHomePackages.add("com.android.home.fake");
+
+ mController.updateUninstallButton();
+
+ verify(mButtonPrefs).setButton2Enabled(true);
+ }
+
+ @Test
public void updateUninstallButton_isSystemRro_setButtonDisable() {
mAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
@@ -477,7 +510,7 @@
throws PackageManager.NameNotFoundException {
doReturn(AppButtonsPreferenceController.AVAILABLE)
.when(mController).getAvailabilityStatus();
- doReturn(mPackageInfo).when(mPackageManger).getPackageInfo(anyString(), anyInt());
+ doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(anyString(), anyInt());
doReturn(mButtonPrefs).when(mScreen).findPreference(anyString());
mController.displayPreference(mScreen);
mController.mButtonsPref = null;
diff --git a/tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java b/tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java
new file mode 100644
index 0000000..3aa281c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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.biometrics;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.DialogInterface;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.os.Looper;
+import android.widget.Button;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.settings.R;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowAlertDialogCompat.class)
+public class BiometricsSplitScreenDialogTest {
+ @Rule
+ public final MockitoRule mocks = MockitoJUnit.rule();
+ private FragmentActivity mActivity;
+ private BiometricsSplitScreenDialog mFragment;
+
+ @Before
+ public void setUp() {
+ ShadowAlertDialogCompat.reset();
+ mActivity = Robolectric.buildActivity(FragmentActivity.class).setup().get();
+ }
+
+ @After
+ public void tearDown() {
+ ShadowAlertDialogCompat.reset();
+ }
+
+ @Test
+ public void testTexts_face() {
+ final AlertDialog dialog = setUpFragment(TYPE_FACE, false /*destroyActivity*/);
+
+ final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
+ mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_title));
+ assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
+ mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_message));
+ }
+
+ @Test
+ public void testTexts_fingerprint() {
+ final AlertDialog dialog = setUpFragment(TYPE_FINGERPRINT, false /*destroyActivity*/);
+
+ final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
+ mActivity.getString(
+ R.string.biometric_settings_add_fingerprint_in_split_mode_title));
+ assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
+ mActivity.getString(
+ R.string.biometric_settings_add_fingerprint_in_split_mode_message));
+ }
+
+ @Test
+ public void testButton_destroyActivity() {
+ final AlertDialog dialog = setUpFragment(TYPE_FACE, true /*destroyActivity*/);
+ final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+
+ assertThat(button).isNotNull();
+ button.performClick();
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+
+ assertThat(dialog.isShowing()).isFalse();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+
+ @Test
+ public void testButton_notDestroyActivity() {
+ final AlertDialog dialog = setUpFragment(TYPE_FACE, false /*destroyActivity*/);
+ final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+
+ assertThat(button).isNotNull();
+ button.performClick();
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+
+ assertThat(dialog.isShowing()).isFalse();
+ assertThat(mActivity.isFinishing()).isFalse();
+ }
+
+ private AlertDialog setUpFragment(
+ @BiometricAuthenticator.Modality int biometricsModality, boolean destroyActivity) {
+ mFragment = BiometricsSplitScreenDialog.newInstance(biometricsModality, destroyActivity);
+ mFragment.show(mActivity.getSupportFragmentManager(), null);
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+ return dialog;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java
index 43d2add..a0ef57f 100644
--- a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java
@@ -16,8 +16,6 @@
package com.android.settings.biometrics.combination;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
-
import static com.android.settings.biometrics.combination.BiometricsSettingsBase.CONFIRM_REQUEST;
import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED;
@@ -26,7 +24,6 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
@@ -37,11 +34,8 @@
import android.content.Context;
import android.content.Intent;
-import android.hardware.biometrics.ComponentInfoInternal;
-import android.hardware.biometrics.SensorProperties;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle;
import android.util.AndroidRuntimeException;
import android.view.LayoutInflater;
@@ -52,15 +46,12 @@
import androidx.annotation.XmlRes;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
-import com.android.settings.biometrics.BiometricStatusPreferenceController;
-import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.biometrics.face.FaceStatusPreferenceController;
import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -72,7 +63,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -112,8 +102,6 @@
private FaceStatusPreferenceController mFaceStatusPreferenceController;
@Mock
private FaceManager mFaceManager;
- @Mock
- private FragmentTransaction mFragmentTransaction;
@Before
public void setUp() {
@@ -351,133 +339,6 @@
}
@Test
- public void testClickFingerprintUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() {
- testClickFingerprintUnlock(true /* isInMultiWindow */, false /* hasEnrolledFingerprint */);
- verifyShowsDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey());
- }
-
- @Test
- public void testClickFingerprintUnlock_inMultiWindow_withEnrolledFp_noDialog() {
- testClickFingerprintUnlock(true /* isInMultiWindow */, true /* hasEnrolledFingerprint */);
- verifyNoDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey());
- }
-
- @Test
- public void testClickFingerprintUnlock_inFullScreen_withoutEnrolledFp_noDialog() {
- testClickFingerprintUnlock(false /* isInMultiWindow */, false /* hasEnrolledFingerprint */);
- verifyNoDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey());
- }
-
- private void testClickFingerprintUnlock(boolean isInMultiWindow,
- boolean hasEnrolledFingerprint) {
- final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
- props.add(new FingerprintSensorPropertiesInternal(
- 0 /* sensorId */,
- SensorProperties.STRENGTH_STRONG,
- 1 /* maxEnrollmentsPerUser */,
- new ArrayList<ComponentInfoInternal>(),
- TYPE_UDFPS_OPTICAL,
- true /* resetLockoutRequiresHardwareAuthToken */));
- doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
-
- doAnswer(invocation -> {
- final FingerprintManager.GenerateChallengeCallback callback =
- invocation.getArgument(1);
- callback.onChallengeGenerated(0, 0, 1L);
- return null;
- }).when(mFingerprintManager).generateChallenge(anyInt(), any());
- doReturn(new byte[]{1}).when(mFragment).requestGatekeeperHat(any(), anyLong(), anyInt(),
- anyLong());
- FragmentManager fragmentManager = mock(FragmentManager.class);
- doReturn(fragmentManager).when(mActivity).getSupportFragmentManager();
- doReturn(mFragmentTransaction).when(fragmentManager).beginTransaction();
- doReturn(isInMultiWindow).when(mActivity).isInMultiWindowMode();
- doReturn(hasEnrolledFingerprint).when(mFingerprintManager).hasEnrolledFingerprints(
- anyInt());
-
- // Start fragment
- mFragment.onAttach(mContext);
- mFragment.onCreate(null);
- mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
- mFragment.onResume();
-
- // User clicks on "Fingerprint Unlock"
- final Preference preference = new Preference(mContext);
- preference.setKey(mFragment.getFingerprintPreferenceKey());
- mFragment.onPreferenceTreeClick(preference);
- }
-
- @Test
- @Ignore("b/295325503")
- public void testClickFaceUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() {
- testClickFaceUnlock(true /* isInMultiWindow */, false /*hasEnrolledFace*/);
- verifyShowsDialogAfterClickingUnlock(mFragment.getFacePreferenceKey());
- }
-
- @Test
- public void testClickFaceUnlock_inMultiWindow_withEnrolledFp_noDialog() {
- testClickFaceUnlock(true /* isInMultiWindow */, true /* hasEnrolledFace */);
- verifyNoDialogAfterClickingUnlock(mFragment.getFacePreferenceKey());
- }
-
- @Test
- public void testClickFaceUnlock_inFullScreen_withoutEnrolledFp_noDialog() {
- testClickFaceUnlock(false /* isInMultiWindow */ , false /* hasEnrolledFace */);
- verifyNoDialogAfterClickingUnlock(mFragment.getFacePreferenceKey());
- }
-
- private void testClickFaceUnlock(boolean isInMultiWindow, boolean hasEnrolledFace) {
- doAnswer(invocation -> {
- final FaceManager.GenerateChallengeCallback callback =
- invocation.getArgument(1);
- callback.onGenerateChallengeResult(0, 0, 1L);
- return null;
- }).when(mFaceManager).generateChallenge(anyInt(), any());
- doReturn(new byte[] { 1 }).when(mFragment).requestGatekeeperHat(any(), anyLong(), anyInt(),
- anyLong());
- FragmentManager fragmentManager = mock(FragmentManager.class);
- doReturn(fragmentManager).when(mActivity).getSupportFragmentManager();
- doReturn(mFragmentTransaction).when(fragmentManager).beginTransaction();
- doReturn(isInMultiWindow).when(mActivity).isInMultiWindowMode();
- doReturn(hasEnrolledFace).when(mFaceManager).hasEnrolledTemplates(
- anyInt());
-
- // Start fragment
- mFragment.onAttach(mContext);
- mFragment.onCreate(null);
- mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
- mFragment.onResume();
-
- // User clicks on "Face Unlock"
- final Preference preference = new Preference(mContext);
- preference.setKey(mFragment.getFacePreferenceKey());
- mFragment.onPreferenceTreeClick(preference);
- }
-
- private void verifyNoDialogAfterClickingUnlock(String preferenceKey) {
- final BiometricStatusPreferenceController controller =
- preferenceKey.equals(mFragment.getFacePreferenceKey())
- ? mFaceStatusPreferenceController
- : mFingerprintStatusPreferenceController;
- verify(controller).handlePreferenceTreeClick(mPreferenceCaptor.capture());
- List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
- assertThat(capturedPreferences).hasSize(1);
- assertThat(capturedPreferences.get(0).getKey()).isEqualTo(preferenceKey);
- verify(mFragmentTransaction, never()).add(any(),
- eq(BiometricsSplitScreenDialog.class.getName()));
- }
-
- private void verifyShowsDialogAfterClickingUnlock(String preferenceKey) {
- final BiometricStatusPreferenceController controller =
- preferenceKey.equals(mFragment.getFacePreferenceKey())
- ? mFaceStatusPreferenceController
- : mFingerprintStatusPreferenceController;
- verify(controller, never()).handlePreferenceTreeClick(any());
- verify(mFragmentTransaction).add(any(),
- eq(BiometricsSplitScreenDialog.class.getName()));
- }
-
- @Test
public void testNoCrashIfDetachActivityDuringGeneratingChallengeThroughFaceManager() {
doAnswer(invocation -> {
final FaceManager.GenerateChallengeCallback callback =
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java
index 459e377..beb7a9f 100644
--- a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java
@@ -38,6 +38,7 @@
import android.app.Activity;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -46,12 +47,15 @@
import android.hardware.face.FaceSensorProperties;
import android.hardware.face.FaceSensorPropertiesInternal;
import android.hardware.face.IFaceAuthenticatorsRegisteredCallback;
+import android.os.Looper;
import android.os.UserHandle;
import android.view.View;
+import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
import androidx.test.core.app.ApplicationProvider;
import com.android.internal.widget.LockPatternUtils;
@@ -62,6 +66,7 @@
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowSensorPrivacyManager;
@@ -101,7 +106,8 @@
ShadowUtils.class,
ShadowDevicePolicyManager.class,
ShadowSensorPrivacyManager.class,
- SettingsShadowResources.class
+ SettingsShadowResources.class,
+ ShadowAlertDialogCompat.class
})
public class FaceEnrollIntroductionTest {
@@ -123,8 +129,8 @@
enum GateKeeperAction {CALL_SUPER, RETURN_BYTE_ARRAY, THROW_CREDENTIAL_NOT_MATCH}
public static class TestFaceEnrollIntroduction extends FaceEnrollIntroduction {
-
private int mRecreateCount = 0;
+ public boolean mIsMultiWindowMode;
public int getRecreateCount() {
return mRecreateCount;
@@ -161,6 +167,11 @@
protected boolean launchPostureGuidance() {
return super.launchPostureGuidance();
}
+
+ @Override
+ public boolean isInMultiWindowMode() {
+ return mIsMultiWindowMode;
+ }
}
@Before
@@ -178,6 +189,7 @@
public void tearDown() {
ShadowUtils.reset();
ShadowLockPatternUtils.reset();
+ ShadowAlertDialogCompat.reset();
}
private void setupActivity() {
@@ -596,4 +608,37 @@
assertThat(result).isEqualTo(0);
}
+ @Test
+ public void multiWindow_showsDialog() {
+ mController = Robolectric.buildActivity(TestFaceEnrollIntroduction.class);
+ mActivity = (TestFaceEnrollIntroduction) mController.get();
+ mActivity.mIsMultiWindowMode = true;
+ mController.setup().get();
+
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+
+ final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
+ mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_title));
+ assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
+ mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_message));
+
+ final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+ assertThat(button).isNotNull();
+ button.performClick();
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+ assertThat(dialog.isShowing()).isFalse();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+
+ @Test
+ public void singleWindow_noDialog() {
+ Robolectric.buildActivity(TestFaceEnrollIntroduction.class).setup().get();
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java
index 45ff247..58e7e2d 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java
@@ -20,9 +20,7 @@
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment;
-import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.ADD_FINGERPRINT_REQUEST;
import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.CHOOSE_LOCK_GENERIC_REQUEST;
-import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_FINGERPRINT_ADD;
import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_REQUIRE_SCREEN_ON_TO_AUTH;
import static com.google.common.truth.Truth.assertThat;
@@ -34,9 +32,7 @@
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.Context;
@@ -57,10 +53,8 @@
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
-import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;
-import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowFragment;
@@ -133,35 +127,6 @@
}
@Test
- public void testAddFingerprint_inFullScreen_noDialog() {
- setUpFragment(false);
- // Click "Add Fingerprint"
- final Preference preference = new Preference(mContext);
- preference.setKey(KEY_FINGERPRINT_ADD);
- mFragment.onPreferenceTreeClick(preference);
-
- verify(mFragment).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST));
- verify(mFragmentTransaction, never()).add(any(),
- eq(BiometricsSplitScreenDialog.class.getName()));
-
- }
-
- @Test
- public void testAddFingerprint_inMultiWindow_showsDialog() {
- setUpFragment(false);
-
- doReturn(true).when(mActivity).isInMultiWindowMode();
-
- // Click "Add Fingerprint"
- final Preference preference = new Preference(mContext);
- preference.setKey(KEY_FINGERPRINT_ADD);
- mFragment.onPreferenceTreeClick(preference);
-
- verify(mFragment, times(0)).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST));
- verify(mFragmentTransaction).add(any(), eq(BiometricsSplitScreenDialog.class.getName()));
- }
-
- @Test
public void testChooseLockKeyForFingerprint() {
setUpFragment(true);
ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java
index 493436c..6b67734 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java
@@ -21,6 +21,7 @@
import static org.robolectric.RuntimeEnvironment.application;
+import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -28,14 +29,18 @@
import android.hardware.biometrics.SensorProperties;
import android.hardware.fingerprint.FingerprintSensorProperties;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.os.Looper;
import android.view.View;
import android.widget.Button;
+import androidx.appcompat.app.AlertDialog;
+
import com.android.settings.R;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricEnrollIntroduction;
import com.android.settings.password.SetupSkipDialog;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowFingerprintManager;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowStorageManager;
@@ -66,12 +71,23 @@
ShadowFingerprintManager.class,
ShadowLockPatternUtils.class,
ShadowStorageManager.class,
- ShadowUserManager.class
+ ShadowUserManager.class,
+ ShadowAlertDialogCompat.class
})
public class SetupFingerprintEnrollIntroductionTest {
private ActivityController<SetupFingerprintEnrollIntroduction> mController;
+ public static class TestSetupFingerprintEnrollIntroductionInMultiWindowMode
+ extends SetupFingerprintEnrollIntroduction {
+ public boolean mIsMultiWindowMode = true;
+
+ @Override
+ public boolean isInMultiWindowMode() {
+ return mIsMultiWindowMode;
+ }
+ }
+
@Before
public void setUp() {
Shadows.shadowOf(application.getPackageManager())
@@ -105,6 +121,36 @@
@After
public void tearDown() {
ShadowStorageManager.reset();
+ ShadowAlertDialogCompat.reset();
+ }
+
+ @Test
+ public void multiWindow_showsDialog() {
+ Activity activity = Robolectric.buildActivity(
+ TestSetupFingerprintEnrollIntroductionInMultiWindowMode.class).setup().get();
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+
+ final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo(
+ activity.getString(
+ R.string.biometric_settings_add_fingerprint_in_split_mode_title));
+ assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo(
+ activity.getString(
+ R.string.biometric_settings_add_fingerprint_in_split_mode_message));
+
+ // TODO(b/299573056): Make WizardManagerHelper.isAnySetupWizard(getIntent()) correct and
+ // test button click not finishing the activity.
+ }
+
+ @Test
+ public void singleWindow_noDialog() {
+ Robolectric.buildActivity(SetupFingerprintEnrollIntroduction.class).setup().get();
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index cfd256f..fc72c41 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -18,6 +18,8 @@
import static android.bluetooth.BluetoothDevice.BOND_NONE;
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceControlsController.KEY_DEVICE_CONTROLS_GENERAL_GROUP;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -29,8 +31,10 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.companion.CompanionDeviceManager;
import android.content.Context;
+import android.content.Intent;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.os.UserManager;
@@ -49,6 +53,8 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.google.common.collect.ImmutableList;
@@ -65,6 +71,8 @@
import org.robolectric.annotation.Config;
import org.robolectric.fakes.RoboMenu;
+import java.util.List;
+
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
com.android.settings.testutils.shadow.ShadowUserManager.class,
@@ -216,6 +224,38 @@
verify(mFragment).finish();
}
+ @Test
+ public void createPreferenceControllers_launchFromHAPage_deviceControllerNotExist() {
+ BluetoothDeviceDetailsFragment fragment = setupFragment();
+ Intent intent = fragment.getActivity().getIntent();
+ intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
+ SettingsEnums.ACCESSIBILITY_HEARING_AID_SETTINGS);
+ fragment.onAttach(mContext);
+
+ List<AbstractPreferenceController> controllerList = fragment.createPreferenceControllers(
+ mContext);
+
+ assertThat(controllerList.stream()
+ .anyMatch(controller -> controller.getPreferenceKey().equals(
+ KEY_DEVICE_CONTROLS_GENERAL_GROUP))).isFalse();
+ }
+
+ @Test
+ public void createPreferenceControllers_notLaunchFromHAPage_deviceControllerExist() {
+ BluetoothDeviceDetailsFragment fragment = setupFragment();
+ Intent intent = fragment.getActivity().getIntent();
+ intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
+ SettingsEnums.PAGE_UNKNOWN);
+ fragment.onAttach(mContext);
+
+ List<AbstractPreferenceController> controllerList = fragment.createPreferenceControllers(
+ mContext);
+
+ assertThat(controllerList.stream()
+ .anyMatch(controller -> controller.getPreferenceKey().equals(
+ KEY_DEVICE_CONTROLS_GENERAL_GROUP))).isTrue();
+ }
+
private InputDevice createInputDeviceWithMatchingBluetoothAddress() {
doReturn(new int[]{0}).when(mInputManager).getInputDeviceIds();
InputDevice device = mock(InputDevice.class);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
index 00115d7..cd48bf1 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
@@ -20,6 +20,8 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -28,18 +30,26 @@
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.Pair;
import com.android.settings.connecteddevice.DevicePreferenceCallback;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowAudioManager;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowCachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -58,6 +68,10 @@
public class ConnectedBluetoothDeviceUpdaterTest {
private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C";
+ private static final String FAKE_EXCLUSIVE_MANAGER_NAME = "com.fake.name";
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Mock
private DashboardFragment mDashboardFragment;
@@ -69,6 +83,8 @@
private BluetoothDevice mBluetoothDevice;
@Mock
private Drawable mDrawable;
+ @Mock
+ private PackageManager mPackageManager;
private Context mContext;
private ConnectedBluetoothDeviceUpdater mBluetoothDeviceUpdater;
@@ -82,7 +98,7 @@
MockitoAnnotations.initMocks(this);
Pair<Drawable, String> pairs = new Pair<>(mDrawable, "fake_device");
- mContext = RuntimeEnvironment.application;
+ mContext = spy(RuntimeEnvironment.application);
mAudioManager = mContext.getSystemService(AudioManager.class);
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mShadowBluetoothAdapter.setEnabled(true);
@@ -92,6 +108,7 @@
mCachedDevices = new ArrayList<>();
mCachedDevices.add(mCachedBluetoothDevice);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS);
when(mCachedBluetoothDevice.getDrawableWithDescription()).thenReturn(pairs);
@@ -320,4 +337,97 @@
assertThat(btPreference.shouldHideSecondTarget()).isTrue();
}
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_notExclusiveManagedDevice_addDevice() {
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ when(mBluetoothDeviceUpdater
+ .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
+ when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ null);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_notAllowedExclusiveManagedDevice_addDevice() {
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ when(mBluetoothDeviceUpdater
+ .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
+ when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ FAKE_EXCLUSIVE_MANAGER_NAME.getBytes());
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_existingExclusivelyManagedDeviceWithPackageInstalled_removePreference()
+ throws Exception {
+ final String exclusiveManagerName =
+ BluetoothUtils.getExclusiveManagers().stream().findAny().orElse(
+ FAKE_EXCLUSIVE_MANAGER_NAME);
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ when(mBluetoothDeviceUpdater
+ .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
+ when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ exclusiveManagerName.getBytes());
+ doReturn(new PackageInfo()).when(mPackageManager).getPackageInfo(exclusiveManagerName, 0);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice);
+ verify(mBluetoothDeviceUpdater, never()).addPreference(mCachedBluetoothDevice);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_newExclusivelyManagedDeviceWithPackageInstalled_doNotAddPreference()
+ throws Exception {
+ final String exclusiveManagerName =
+ BluetoothUtils.getExclusiveManagers().stream().findAny().orElse(
+ FAKE_EXCLUSIVE_MANAGER_NAME);
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ when(mBluetoothDeviceUpdater
+ .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
+ when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ exclusiveManagerName.getBytes());
+ doReturn(new PackageInfo()).when(mPackageManager).getPackageInfo(exclusiveManagerName, 0);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice);
+ verify(mBluetoothDeviceUpdater, never()).addPreference(mCachedBluetoothDevice);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_exclusivelyManagedDeviceWithoutPackageInstalled_addDevice()
+ throws Exception {
+ final String exclusiveManagerName =
+ BluetoothUtils.getExclusiveManagers().stream().findAny().orElse(
+ FAKE_EXCLUSIVE_MANAGER_NAME);
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ when(mBluetoothDeviceUpdater
+ .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true);
+ when(mCachedBluetoothDevice.isConnectedHfpDevice()).thenReturn(true);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ exclusiveManagerName.getBytes());
+ doThrow(new PackageManager.NameNotFoundException()).when(mPackageManager).getPackageInfo(
+ exclusiveManagerName, 0);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
index c229449..349391d 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
@@ -18,6 +18,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -28,17 +29,26 @@
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.Pair;
import com.android.settings.connecteddevice.DevicePreferenceCallback;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -56,6 +66,10 @@
public class SavedBluetoothDeviceUpdaterTest {
private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C";
+ private static final String FAKE_EXCLUSIVE_MANAGER_NAME = "com.fake.name";
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Mock
private DashboardFragment mDashboardFragment;
@@ -73,6 +87,8 @@
private LocalBluetoothManager mBluetoothManager;
@Mock
private Drawable mDrawable;
+ @Mock
+ private PackageManager mPackageManager;
private Context mContext;
private SavedBluetoothDeviceUpdater mBluetoothDeviceUpdater;
@@ -84,12 +100,13 @@
MockitoAnnotations.initMocks(this);
Pair<Drawable, String> pairs = new Pair<>(mDrawable, "fake_device");
- mContext = RuntimeEnvironment.application;
+ mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mDashboardFragment).getContext();
when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
when(mCachedBluetoothDevice.getAddress()).thenReturn(MAC_ADDRESS);
when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
when(mCachedBluetoothDevice.getDrawableWithDescription()).thenReturn(pairs);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
mBluetoothDeviceUpdater = spy(new SavedBluetoothDeviceUpdater(mContext,
mDevicePreferenceCallback, false, /* metricsCategory= */ 0));
@@ -103,10 +120,10 @@
mCachedDevices.add(mCachedBluetoothDevice);
when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
when(mDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices);
-
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
public void update_filterMatch_addPreference() {
doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState();
doReturn(false).when(mBluetoothDevice).isConnected();
@@ -118,6 +135,7 @@
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
public void update_filterNotMatch_removePreference() {
doReturn(BluetoothDevice.BOND_NONE).when(mBluetoothDevice).getBondState();
doReturn(true).when(mBluetoothDevice).isConnected();
@@ -298,4 +316,125 @@
verify(mBluetoothDeviceUpdater, never()).addPreference(mCachedBluetoothDevice,
BluetoothDevicePreference.SortType.TYPE_NO_SORT);
}
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_notExclusivelyManagedDevice_addDevice() {
+ final Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
+ cachedDevices.add(mCachedBluetoothDevice);
+
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(false);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ null);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice,
+ BluetoothDevicePreference.SortType.TYPE_NO_SORT);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_notAllowedExclusivelyManagedDevice_addDevice() {
+ final Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
+ cachedDevices.add(mCachedBluetoothDevice);
+
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(false);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ FAKE_EXCLUSIVE_MANAGER_NAME.getBytes());
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice,
+ BluetoothDevicePreference.SortType.TYPE_NO_SORT);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_existingExclusivelyManagedDeviceWithPackageInstalled_removePreference()
+ throws Exception {
+ final Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
+ final String exclusiveManagerName =
+ BluetoothUtils.getExclusiveManagers().stream().findAny().orElse(
+ FAKE_EXCLUSIVE_MANAGER_NAME);
+
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(false);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ exclusiveManagerName.getBytes());
+
+ doReturn(new PackageInfo()).when(mPackageManager).getPackageInfo(exclusiveManagerName, 0);
+ mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, mPreference);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice);
+ verify(mBluetoothDeviceUpdater, never()).addPreference(mCachedBluetoothDevice,
+ BluetoothDevicePreference.SortType.TYPE_NO_SORT);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_newExclusivelyManagedDeviceWithPackageInstalled_doNotAddPreference()
+ throws Exception {
+ final Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
+ final String exclusiveManagerName =
+ BluetoothUtils.getExclusiveManagers().stream().findAny().orElse(
+ FAKE_EXCLUSIVE_MANAGER_NAME);
+ cachedDevices.add(mCachedBluetoothDevice);
+
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(false);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ exclusiveManagerName.getBytes());
+
+ doReturn(new PackageInfo()).when(mPackageManager).getPackageInfo(exclusiveManagerName, 0);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice);
+ verify(mBluetoothDeviceUpdater, never()).addPreference(mCachedBluetoothDevice,
+ BluetoothDevicePreference.SortType.TYPE_NO_SORT);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+ public void update_exclusivelyManagedDeviceWithoutPackageInstalled_addDevice()
+ throws Exception {
+ final Collection<CachedBluetoothDevice> cachedDevices = new ArrayList<>();
+ final String exclusiveManagerName =
+ BluetoothUtils.getExclusiveManagers().stream().findAny().orElse(
+ FAKE_EXCLUSIVE_MANAGER_NAME);
+ cachedDevices.add(mCachedBluetoothDevice);
+
+ when(mBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(false);
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER)).thenReturn(
+ exclusiveManagerName.getBytes());
+
+ doThrow(new PackageManager.NameNotFoundException()).when(mPackageManager).getPackageInfo(
+ exclusiveManagerName, 0);
+
+ mBluetoothDeviceUpdater.update(mCachedBluetoothDevice);
+
+ verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice,
+ BluetoothDevicePreference.SortType.TYPE_NO_SORT);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
index a3348ca..09f7a38 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
@@ -25,8 +25,6 @@
import android.content.Context;
import android.content.pm.PackageManager;
-import android.platform.test.annotations.RequiresFlagsDisabled;
-import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.SearchIndexableResource;
@@ -34,7 +32,6 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerListHelper;
-import com.android.settings.flags.Flags;
import com.android.settings.slices.SlicePreferenceController;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowConnectivityManager;
@@ -53,8 +50,12 @@
import java.util.List;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class,
- ShadowConnectivityManager.class, ShadowBluetoothAdapter.class})
+@Config(
+ shadows = {
+ ShadowUserManager.class,
+ ShadowConnectivityManager.class,
+ ShadowBluetoothAdapter.class
+ })
public class ConnectedDeviceDashboardFragmentTest {
@Rule
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@@ -98,7 +99,6 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void nonIndexableKeys_existInXmlLayout() {
final List<String> niks =
ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
@@ -112,24 +112,6 @@
KEY_DISCOVERABLE_FOOTER,
KEY_SAVED_DEVICE_SEE_ALL,
KEY_FAST_PAIR_DEVICE_SEE_ALL,
- KEY_AUDIO_SHARING_SETTINGS);
- }
-
- @Test
- @RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
- public void nonIndexableKeys_existInXmlLayout_flagOff() {
- final List<String> niks =
- ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
- mContext);
-
- assertThat(niks)
- .containsExactly(
- KEY_CONNECTED_DEVICES,
- KEY_AVAILABLE_DEVICES,
- KEY_NEARBY_DEVICES,
- KEY_DISCOVERABLE_FOOTER,
- KEY_SAVED_DEVICE_SEE_ALL,
- KEY_FAST_PAIR_DEVICE_SEE_ALL,
KEY_AUDIO_SHARING_DEVICE_LIST,
KEY_AUDIO_SHARING_SETTINGS);
}
@@ -160,10 +142,12 @@
PreferenceControllerListHelper.getPreferenceControllersFromXml(
mContext, R.xml.connected_devices);
- assertThat(controllers
- .stream()
- .filter(controller -> controller instanceof SlicePreferenceController)
- .count())
+ assertThat(
+ controllers.stream()
+ .filter(
+ controller ->
+ controller instanceof SlicePreferenceController)
+ .count())
.isEqualTo(1);
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragmentTest.java
index fa6cc6c..757964b 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragmentTest.java
@@ -158,7 +158,9 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_singleConnectedDevice_dialogDismiss() {
- mFragment.show(mParent, new ArrayList<>(), (item) -> {});
+ ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
+ list.add(TEST_DEVICE_ITEM1);
+ mFragment.show(mParent, list, (item) -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
@@ -170,10 +172,12 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_singleConnectedDevice_shareClicked() {
+ ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
+ list.add(TEST_DEVICE_ITEM1);
AtomicBoolean isShareBtnClicked = new AtomicBoolean(false);
mFragment.show(
mParent,
- new ArrayList<>(),
+ list,
(item) -> {
isShareBtnClicked.set(true);
});
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragmentTest.java
index 335bbe3..966a695 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragmentTest.java
@@ -18,15 +18,18 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothStatusCodes;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.view.View;
+import android.widget.Button;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
@@ -37,11 +40,13 @@
import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
@@ -50,6 +55,7 @@
import org.robolectric.shadows.androidx.fragment.FragmentController;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
@RunWith(RobolectricTestRunner.class)
@Config(
@@ -67,38 +73,68 @@
private static final String TEST_DEVICE_NAME1 = "test1";
private static final String TEST_DEVICE_NAME2 = "test2";
private static final String TEST_DEVICE_NAME3 = "test3";
+ private static final int TEST_GROUP_ID1 = 1;
+ private static final int TEST_GROUP_ID2 = 2;
+ private static final int TEST_GROUP_ID3 = 3;
private static final AudioSharingDeviceItem TEST_DEVICE_ITEM1 =
- new AudioSharingDeviceItem(TEST_DEVICE_NAME1, /* groupId= */ 1, /* isActive= */ true);
+ new AudioSharingDeviceItem(TEST_DEVICE_NAME1, TEST_GROUP_ID1, /* isActive= */ true);
private static final AudioSharingDeviceItem TEST_DEVICE_ITEM2 =
- new AudioSharingDeviceItem(TEST_DEVICE_NAME2, /* groupId= */ 2, /* isActive= */ false);
+ new AudioSharingDeviceItem(TEST_DEVICE_NAME2, TEST_GROUP_ID2, /* isActive= */ false);
+ private static final AudioSharingDeviceItem TEST_DEVICE_ITEM3 =
+ new AudioSharingDeviceItem(TEST_DEVICE_NAME3, TEST_GROUP_ID3, /* isActive= */ false);
+ @Mock private BluetoothDevice mDevice1;
+ @Mock private BluetoothDevice mDevice2;
+ @Mock private BluetoothDevice mDevice3;
+
+ @Mock private CachedBluetoothDevice mCachedDevice1;
+ @Mock private CachedBluetoothDevice mCachedDevice2;
+ @Mock private CachedBluetoothDevice mCachedDevice3;
private Fragment mParent;
private AudioSharingDisconnectDialogFragment mFragment;
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
+ private ArrayList<AudioSharingDeviceItem> mDeviceItems = new ArrayList<>();
@Before
public void setUp() {
- ShadowAlertDialogCompat.reset();
+ AlertDialog latestAlertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ if (latestAlertDialog != null) {
+ latestAlertDialog.dismiss();
+ ShadowAlertDialogCompat.reset();
+ }
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mShadowBluetoothAdapter.setEnabled(true);
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED);
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED);
+ when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
+ when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
+ when(mCachedDevice1.getGroupId()).thenReturn(TEST_GROUP_ID1);
+ when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME2);
+ when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
+ when(mCachedDevice2.getGroupId()).thenReturn(TEST_GROUP_ID2);
+ when(mCachedDevice3.getName()).thenReturn(TEST_DEVICE_NAME3);
+ when(mCachedDevice3.getDevice()).thenReturn(mDevice3);
+ when(mCachedDevice3.getGroupId()).thenReturn(TEST_GROUP_ID3);
mFragment = new AudioSharingDisconnectDialogFragment();
mParent = new Fragment();
FragmentController.setupFragment(
mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
- ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
- list.add(TEST_DEVICE_ITEM1);
- list.add(TEST_DEVICE_ITEM2);
- mFragment.show(mParent, list, TEST_DEVICE_NAME3, (item) -> {});
+ mDeviceItems.add(TEST_DEVICE_ITEM1);
+ mDeviceItems.add(TEST_DEVICE_ITEM2);
+ mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> {});
shadowMainLooper().idle();
}
@Test
@RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_flagOff_dialogNotExist() {
+ ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
+ list.add(TEST_DEVICE_ITEM1);
+ list.add(TEST_DEVICE_ITEM2);
+ mFragment.show(mParent, list, mCachedDevice3, (item) -> {});
+ shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNull();
}
@@ -107,6 +143,7 @@
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_flagOn_dialogShowBtnForTwoDevices() {
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
View rootView = shadowDialog.getView();
RecyclerView view = rootView.findViewById(R.id.device_btn_list);
@@ -115,8 +152,70 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void onCreateDialog_dialogIsShowingForSameGroup_updateDialog() {
+ String prefix = "Disconnect ";
+ AtomicBoolean isItemBtnClicked = new AtomicBoolean(false);
+ AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ View rootView = shadowDialog.getView();
+ RecyclerView view = rootView.findViewById(R.id.device_btn_list);
+ assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
+ Button btn1 =
+ view.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.device_button);
+ assertThat(btn1.getText().toString()).isEqualTo(prefix + TEST_DEVICE_NAME1);
+ Button btn2 =
+ view.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.device_button);
+ assertThat(btn2.getText().toString()).isEqualTo(prefix + TEST_DEVICE_NAME2);
+ btn1.performClick();
+ assertThat(isItemBtnClicked.get()).isFalse();
+
+ // Update dialog content with same group
+ mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> isItemBtnClicked.set(true));
+ shadowMainLooper().idle();
+ dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ btn1 = view.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.device_button);
+ btn1.performClick();
+ assertThat(isItemBtnClicked.get()).isTrue();
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void onCreateDialog_dialogIsShowingForNewGroup_updateDialog() {
+ String prefix = "Disconnect ";
+ AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ View rootView = shadowDialog.getView();
+ RecyclerView view = rootView.findViewById(R.id.device_btn_list);
+ assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
+
+ // Update dialog content with new group
+ ArrayList<AudioSharingDeviceItem> newDeviceItems = new ArrayList<>();
+ newDeviceItems.add(TEST_DEVICE_ITEM2);
+ newDeviceItems.add(TEST_DEVICE_ITEM3);
+ mFragment.show(mParent, newDeviceItems, mCachedDevice1, (item) -> {});
+ shadowMainLooper().idle();
+ dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ rootView = shadowDialog.getView();
+ view = rootView.findViewById(R.id.device_btn_list);
+ assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
+ Button btn1 =
+ view.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.device_button);
+ assertThat(btn1.getText().toString()).isEqualTo(prefix + TEST_DEVICE_NAME2);
+ Button btn2 =
+ view.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.device_button);
+ assertThat(btn2.getText().toString()).isEqualTo(prefix + TEST_DEVICE_NAME3);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_clickCancel_dialogDismiss() {
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
View rootView = shadowDialog.getView();
rootView.findViewById(R.id.cancel_btn).performClick();
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragmentTest.java
index 38f80e0..56951c2 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
import android.bluetooth.BluetoothAdapter;
@@ -27,7 +28,6 @@
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.view.View;
-import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
@@ -37,11 +37,13 @@
import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
@@ -67,22 +69,32 @@
private static final String TEST_DEVICE_NAME1 = "test1";
private static final String TEST_DEVICE_NAME2 = "test2";
- private static final AudioSharingDeviceItem TEST_DEVICE_ITEM =
+ private static final AudioSharingDeviceItem TEST_DEVICE_ITEM1 =
new AudioSharingDeviceItem(TEST_DEVICE_NAME1, /* groupId= */ 1, /* isActive= */ true);
+ private static final AudioSharingDeviceItem TEST_DEVICE_ITEM2 =
+ new AudioSharingDeviceItem(TEST_DEVICE_NAME2, /* groupId= */ 2, /* isActive= */ false);
+ @Mock private CachedBluetoothDevice mCachedDevice1;
+ @Mock private CachedBluetoothDevice mCachedDevice2;
private Fragment mParent;
private AudioSharingJoinDialogFragment mFragment;
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
@Before
public void setUp() {
- ShadowAlertDialogCompat.reset();
+ AlertDialog latestAlertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ if (latestAlertDialog != null) {
+ latestAlertDialog.dismiss();
+ ShadowAlertDialogCompat.reset();
+ }
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mShadowBluetoothAdapter.setEnabled(true);
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED);
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED);
+ when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
+ when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME2);
mFragment = new AudioSharingJoinDialogFragment();
mParent = new Fragment();
FragmentController.setupFragment(
@@ -92,7 +104,7 @@
@Test
@RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_flagOff_dialogNotExist() {
- mFragment.show(mParent, new ArrayList<>(), TEST_DEVICE_NAME2, () -> {});
+ mFragment.show(mParent, new ArrayList<>(), mCachedDevice2, () -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNull();
@@ -101,37 +113,58 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_flagOn_dialogShowTextForSingleDevice() {
- mFragment.show(mParent, new ArrayList<>(), TEST_DEVICE_NAME2, () -> {});
+ mFragment.show(mParent, new ArrayList<>(), mCachedDevice2, () -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNotNull();
assertThat(dialog.isShowing()).isTrue();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
- View rootView = shadowDialog.getView();
- TextView subtitle1 = rootView.findViewById(R.id.share_audio_subtitle1);
- assertThat(subtitle1.getText()).isEqualTo(TEST_DEVICE_NAME2);
+ assertThat(shadowDialog.getMessage().toString()).isEqualTo(TEST_DEVICE_NAME2);
}
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_flagOn_dialogShowTextForTwoDevice() {
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
- list.add(TEST_DEVICE_ITEM);
- mFragment.show(mParent, list, TEST_DEVICE_NAME2, () -> {});
+ list.add(TEST_DEVICE_ITEM1);
+ mFragment.show(mParent, list, mCachedDevice2, () -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNotNull();
assertThat(dialog.isShowing()).isTrue();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
- View rootView = shadowDialog.getView();
- TextView subtitle1 = rootView.findViewById(R.id.share_audio_subtitle1);
- assertThat(subtitle1.getText()).isEqualTo(TEST_DEVICE_NAME1 + " and " + TEST_DEVICE_NAME2);
+ assertThat(shadowDialog.getMessage().toString())
+ .isEqualTo(TEST_DEVICE_NAME1 + " and " + TEST_DEVICE_NAME2);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void onCreateDialog_dialogIsShowing_updateDialog() {
+ ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
+ list.add(TEST_DEVICE_ITEM1);
+ mFragment.show(mParent, list, mCachedDevice2, () -> {});
+ shadowMainLooper().idle();
+ AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.isShowing()).isTrue();
+
+ // Update the content
+ ArrayList<AudioSharingDeviceItem> list2 = new ArrayList<>();
+ list2.add(TEST_DEVICE_ITEM2);
+ mFragment.show(mParent, list2, mCachedDevice1, () -> {});
+ shadowMainLooper().idle();
+ dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.isShowing()).isTrue();
+ ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowDialog.getMessage().toString())
+ .isEqualTo(TEST_DEVICE_NAME2 + " and " + TEST_DEVICE_NAME1);
}
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_clickCancel_dialogDismiss() {
- mFragment.show(mParent, new ArrayList<>(), TEST_DEVICE_NAME2, () -> {});
+ mFragment.show(mParent, new ArrayList<>(), mCachedDevice2, () -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
@@ -145,7 +178,7 @@
public void onCreateDialog_clickShare_callbackTriggered() {
AtomicBoolean isShareBtnClicked = new AtomicBoolean(false);
mFragment.show(
- mParent, new ArrayList<>(), TEST_DEVICE_NAME2, () -> isShareBtnClicked.set(true));
+ mParent, new ArrayList<>(), mCachedDevice2, () -> isShareBtnClicked.set(true));
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java
index 61bc88a..d93105d 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
import android.bluetooth.BluetoothAdapter;
@@ -34,11 +35,13 @@
import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
@@ -61,21 +64,30 @@
@Rule
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
- private static final String TEST_DEVICE_NAME = "test";
+ private static final String TEST_DEVICE_NAME1 = "test1";
+ private static final String TEST_DEVICE_NAME2 = "test2";
+ @Mock private CachedBluetoothDevice mCachedDevice1;
+ @Mock private CachedBluetoothDevice mCachedDevice2;
private Fragment mParent;
private AudioSharingStopDialogFragment mFragment;
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
@Before
public void setUp() {
- ShadowAlertDialogCompat.reset();
+ AlertDialog latestAlertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ if (latestAlertDialog != null) {
+ latestAlertDialog.dismiss();
+ ShadowAlertDialogCompat.reset();
+ }
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mShadowBluetoothAdapter.setEnabled(true);
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED);
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED);
+ when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
+ when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME2);
mFragment = new AudioSharingStopDialogFragment();
mParent = new Fragment();
FragmentController.setupFragment(
@@ -85,7 +97,7 @@
@Test
@RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_flagOff_dialogNotExist() {
- mFragment.show(mParent, TEST_DEVICE_NAME, () -> {});
+ mFragment.show(mParent, mCachedDevice1, () -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNull();
@@ -93,8 +105,30 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void onCreateDialog_dialogIsShowing_updateDialog() {
+ String postMessage = " wants to connect, headphones in audio sharing will disconnect.";
+ mFragment.show(mParent, mCachedDevice1, () -> {});
+ shadowMainLooper().idle();
+ AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.isShowing()).isTrue();
+ ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowDialog.getMessage().toString()).isEqualTo(TEST_DEVICE_NAME1 + postMessage);
+
+ // Update the content
+ mFragment.show(mParent, mCachedDevice2, () -> {});
+ shadowMainLooper().idle();
+ dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.isShowing()).isTrue();
+ shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+ assertThat(shadowDialog.getMessage().toString()).isEqualTo(TEST_DEVICE_NAME2 + postMessage);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_clickCancel_dialogDismiss() {
- mFragment.show(mParent, TEST_DEVICE_NAME, () -> {});
+ mFragment.show(mParent, mCachedDevice1, () -> {});
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
dialog.findViewById(android.R.id.button2).performClick();
@@ -106,7 +140,7 @@
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void onCreateDialog_clickShare_callbackTriggered() {
AtomicBoolean isStopBtnClicked = new AtomicBoolean(false);
- mFragment.show(mParent, TEST_DEVICE_NAME, () -> isStopBtnClicked.set(true));
+ mFragment.show(mParent, mCachedDevice1, () -> isStopBtnClicked.set(true));
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
dialog.findViewById(android.R.id.button1).performClick();
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java
index 0b94061..11e8ec9 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;
import android.bluetooth.BluetoothAdapter;
@@ -71,6 +70,7 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
public void bluetoothOff_switchDisabled() {
+ assertThat(mSwitchBar.isEnabled()).isTrue();
mContext.registerReceiver(
mController.mReceiver,
mController.mIntentFilter,
@@ -79,7 +79,7 @@
intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
mContext.sendBroadcast(intent);
shadowOf(Looper.getMainLooper()).idle();
- verify(mSwitch).setEnabled(false);
+ assertThat(mSwitchBar.isEnabled()).isFalse();
assertThat(mOnSwitchBarChanged).isTrue();
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragmentTest.java
new file mode 100644
index 0000000..58a1272
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsDialogFragmentTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.connecteddevice.audiosharing;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothStatusCodes;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.settings.flags.Flags;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.androidx.fragment.FragmentController;
+
+import java.util.ArrayList;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(
+ shadows = {
+ ShadowAlertDialogCompat.class,
+ ShadowBluetoothAdapter.class,
+ })
+public class CallsAndAlarmsDialogFragmentTest {
+ @Rule public final MockitoRule mocks = MockitoJUnit.rule();
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ private static final String TEST_DEVICE_NAME1 = "test1";
+ private static final String TEST_DEVICE_NAME2 = "test2";
+ private static final AudioSharingDeviceItem TEST_DEVICE_ITEM1 =
+ new AudioSharingDeviceItem(TEST_DEVICE_NAME1, /* groupId= */ 1, /* isActive= */ true);
+
+ private static final AudioSharingDeviceItem TEST_DEVICE_ITEM2 =
+ new AudioSharingDeviceItem(TEST_DEVICE_NAME2, /* groupId= */ 1, /* isActive= */ true);
+
+ private Fragment mParent;
+ private CallsAndAlarmsDialogFragment mFragment;
+ private ShadowBluetoothAdapter mShadowBluetoothAdapter;
+
+ @Before
+ public void setUp() {
+ ShadowAlertDialogCompat.reset();
+ mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+ mShadowBluetoothAdapter.setEnabled(true);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+ BluetoothStatusCodes.FEATURE_SUPPORTED);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
+ BluetoothStatusCodes.FEATURE_SUPPORTED);
+ mFragment = new CallsAndAlarmsDialogFragment();
+ mParent = new Fragment();
+ FragmentController.setupFragment(
+ mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void onCreateDialog_flagOff_dialogNotExist() {
+ mFragment.show(mParent, new ArrayList<>(), (item) -> {});
+ shadowMainLooper().idle();
+ AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void onCreateDialog_showCorrectItems() {
+ ArrayList<AudioSharingDeviceItem> deviceItemList = new ArrayList<>();
+ deviceItemList.add(TEST_DEVICE_ITEM1);
+ deviceItemList.add(TEST_DEVICE_ITEM2);
+ mFragment.show(mParent, deviceItemList, (item) -> {});
+ shadowMainLooper().idle();
+ AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.getListView().getCount()).isEqualTo(2);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceControllerTest.java
new file mode 100644
index 0000000..4cdd364
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/CallsAndAlarmsPreferenceControllerTest.java
@@ -0,0 +1,248 @@
+/*
+ * 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.connecteddevice.audiosharing;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothLeBroadcastAssistant;
+import android.bluetooth.BluetoothLeBroadcastReceiveState;
+import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothStatusCodes;
+import android.content.Context;
+import android.os.Looper;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.bluetooth.Utils;
+import com.android.settings.flags.Flags;
+import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
+import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(
+ shadows = {
+ ShadowBluetoothAdapter.class,
+ ShadowBluetoothUtils.class,
+ })
+public class CallsAndAlarmsPreferenceControllerTest {
+ private static final String PREF_KEY = "calls_and_alarms";
+ private static final String SUMMARY_EMPTY = "No active device in sharing";
+ private static final String TEST_DEVICE_NAME1 = "test1";
+ private static final String TEST_DEVICE_NAME2 = "test2";
+ private static final String TEST_SETTINGS_KEY =
+ "bluetooth_le_broadcast_fallback_active_group_id";
+
+ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ @Spy Context mContext = ApplicationProvider.getApplicationContext();
+ @Mock private PreferenceScreen mScreen;
+ @Mock private LocalBluetoothManager mLocalBtManager;
+ @Mock private BluetoothEventManager mBtEventManager;
+ @Mock private LocalBluetoothProfileManager mLocalBtProfileManager;
+ @Mock private CachedBluetoothDeviceManager mCacheManager;
+ @Mock private LocalBluetoothLeBroadcast mBroadcast;
+ @Mock private LocalBluetoothLeBroadcastAssistant mAssistant;
+ @Mock private BluetoothDevice mDevice1;
+ @Mock private BluetoothDevice mDevice2;
+ @Mock private BluetoothDevice mDevice3;
+ @Mock private CachedBluetoothDevice mCachedDevice1;
+ @Mock private CachedBluetoothDevice mCachedDevice2;
+ @Mock private CachedBluetoothDevice mCachedDevice3;
+ @Mock private BluetoothLeBroadcastReceiveState mState;
+ private CallsAndAlarmsPreferenceController mController;
+ private ShadowBluetoothAdapter mShadowBluetoothAdapter;
+ private LocalBluetoothManager mLocalBluetoothManager;
+ private Lifecycle mLifecycle;
+ private LifecycleOwner mLifecycleOwner;
+ private Preference mPreference;
+
+ @Before
+ public void setUp() {
+ mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+ mShadowBluetoothAdapter.setEnabled(true);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+ BluetoothStatusCodes.FEATURE_SUPPORTED);
+ mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
+ BluetoothStatusCodes.FEATURE_SUPPORTED);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
+ mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
+ when(mLocalBluetoothManager.getEventManager()).thenReturn(mBtEventManager);
+ when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBtProfileManager);
+ when(mLocalBtProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast);
+ when(mLocalBtProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(mAssistant);
+ mController = new CallsAndAlarmsPreferenceController(mContext);
+ mPreference = new Preference(mContext);
+ when(mScreen.findPreference(PREF_KEY)).thenReturn(mPreference);
+ }
+
+ @Test
+ public void onStart_registerCallback() {
+ mController.onStart(mLifecycleOwner);
+ verify(mBtEventManager).registerCallback(mController);
+ verify(mAssistant)
+ .registerServiceCallBack(any(), any(BluetoothLeBroadcastAssistant.Callback.class));
+ }
+
+ @Test
+ public void onStop_unregisterCallback() {
+ mController.onStop(mLifecycleOwner);
+ verify(mBtEventManager).unregisterCallback(mController);
+ verify(mAssistant)
+ .unregisterServiceCallBack(any(BluetoothLeBroadcastAssistant.Callback.class));
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void getAvailabilityStatus_flagOn() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
+ public void getAvailabilityStatus_flagOff() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void updateVisibility_broadcastOffBluetoothOff() {
+ when(mBroadcast.isEnabled(any())).thenReturn(false);
+ mShadowBluetoothAdapter.setEnabled(false);
+ mController.displayPreference(mScreen);
+ mController.updateVisibility();
+ shadowOf(Looper.getMainLooper()).idle();
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void updateVisibility_broadcastOnBluetoothOff() {
+ when(mBroadcast.isEnabled(any())).thenReturn(true);
+ mShadowBluetoothAdapter.setEnabled(false);
+ mController.displayPreference(mScreen);
+ mController.updateVisibility();
+ shadowOf(Looper.getMainLooper()).idle();
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void updateVisibility_broadcastOffBluetoothOn() {
+ when(mBroadcast.isEnabled(any())).thenReturn(false);
+ mController.displayPreference(mScreen);
+ mController.updateVisibility();
+ shadowOf(Looper.getMainLooper()).idle();
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void updateVisibility_broadcastOnBluetoothOn() {
+ when(mBroadcast.isEnabled(any())).thenReturn(true);
+ when(mAssistant.getConnectedDevices()).thenReturn(new ArrayList<BluetoothDevice>());
+ mController.displayPreference(mScreen);
+ mController.updateVisibility();
+ shadowOf(Looper.getMainLooper()).idle();
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getSummary().toString()).isEqualTo(SUMMARY_EMPTY);
+ }
+
+ @Test
+ public void onProfileConnectionStateChanged_updatePreference() {
+ when(mBroadcast.isEnabled(any())).thenReturn(true);
+ when(mAssistant.getConnectedDevices()).thenReturn(new ArrayList<BluetoothDevice>());
+ mController.displayPreference(mScreen);
+ mController.onProfileConnectionStateChanged(
+ mCachedDevice1, BluetoothAdapter.STATE_DISCONNECTED, BluetoothProfile.LE_AUDIO);
+ shadowOf(Looper.getMainLooper()).idle();
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getSummary().toString()).isEqualTo(SUMMARY_EMPTY);
+ }
+
+ @Test
+ public void updatePreference_showCorrectSummary() {
+ final int groupId1 = 1;
+ final int groupId2 = 2;
+ Settings.Secure.putInt(mContext.getContentResolver(), TEST_SETTINGS_KEY, groupId1);
+ when(mCachedDevice1.getGroupId()).thenReturn(groupId1);
+ when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
+ when(mCachedDevice2.getGroupId()).thenReturn(groupId1);
+ when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
+ when(mCachedDevice1.getMemberDevice()).thenReturn(ImmutableSet.of(mCachedDevice2));
+ when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
+ when(mCachedDevice3.getGroupId()).thenReturn(groupId2);
+ when(mCachedDevice3.getDevice()).thenReturn(mDevice3);
+ when(mCachedDevice3.getName()).thenReturn(TEST_DEVICE_NAME2);
+ when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCacheManager);
+ when(mCacheManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
+ when(mCacheManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
+ when(mCacheManager.findDevice(mDevice3)).thenReturn(mCachedDevice3);
+ when(mBroadcast.isEnabled(any())).thenReturn(true);
+ ImmutableList<BluetoothDevice> deviceList = ImmutableList.of(mDevice1, mDevice2, mDevice3);
+ when(mAssistant.getConnectedDevices()).thenReturn(deviceList);
+ when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
+ mController.displayPreference(mScreen);
+ mController.updateVisibility();
+ shadowOf(Looper.getMainLooper()).idle();
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getSummary().toString()).isEqualTo(TEST_DEVICE_NAME1);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 39c381e..0799eaf 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -677,7 +677,7 @@
preference.performClick();
Intent nextStartedActivity =
- Shadows.shadowOf((Application) mApplication).peekNextStartedActivity();
+ Shadows.shadowOf(mApplication).peekNextStartedActivity();
assertThat(nextStartedActivity).isNotNull();
assertThat(nextStartedActivity.getAction()).isEqualTo("test");
}
@@ -704,7 +704,7 @@
mActivity.getSupportFragmentManager().findFragmentByTag("select_profile");
assertThat(dialogFragment).isNotNull();
Intent nextStartedActivity =
- Shadows.shadowOf((Application) mApplication).peekNextStartedActivity();
+ Shadows.shadowOf(mApplication).peekNextStartedActivity();
assertThat(nextStartedActivity).isNull();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java
index 554227e..14ba337 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java
@@ -22,11 +22,17 @@
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
+import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
+import java.util.ArrayList;
+
@RunWith(RobolectricTestRunner.class)
public class BatterySettingsFeatureProviderImplTest {
private BatterySettingsFeatureProviderImpl mImpl;
@@ -52,4 +58,15 @@
public void isBatteryInfoEnabled_returnFalse() {
assertThat(mImpl.isBatteryInfoEnabled(mContext)).isFalse();
}
+
+ @Test
+ public void addBatteryTipDetector_containsLowBatteryTip() {
+ var tips = new ArrayList<BatteryTip>();
+
+ mImpl.addBatteryTipDetector(
+ mContext, tips, new BatteryInfo(), new BatteryTipPolicy(mContext));
+
+ var expectedResult = tips.stream().anyMatch(tip -> tip instanceof LowBatteryTip);
+ assertThat(expectedResult).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
index ba7e9cc..0738ebf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
@@ -98,7 +98,7 @@
@Test
public void onReceive_validScheduledLevel_notResetScheduledValue() {
- final int validScheduledLevel = 12;
+ final int validScheduledLevel = BatterySaverScheduleRadioButtonsController.TRIGGER_LEVEL_MIN;
setScheduledLevel(validScheduledLevel);
mBatterySettingsMigrateChecker.onReceive(mContext, BOOT_COMPLETED_INTENT);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index eeedccc..c05d9ed 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -20,30 +20,29 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Bundle;
-import android.text.format.DateUtils;
import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.widget.CardPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.List;
@@ -53,8 +52,8 @@
private static final String KEY_PREF = "battery_tip";
private static final String KEY_TIP = "key_battery_tip";
- private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS;
+ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock private BatteryTipPreferenceController.BatteryTipListener mBatteryTipListener;
@Mock private PreferenceScreen mPreferenceScreen;
@Mock private BatteryTip mBatteryTip;
@@ -64,21 +63,16 @@
private Context mContext;
private CardPreference mCardPreference;
private BatteryTipPreferenceController mBatteryTipPreferenceController;
- private List<BatteryTip> mOldBatteryTips;
private List<BatteryTip> mNewBatteryTips;
- private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
- mCardPreference = spy(new CardPreference(mContext));
+ mCardPreference = new CardPreference(mContext);
when(mPreferenceScreen.getContext()).thenReturn(mContext);
doReturn(mCardPreference).when(mPreferenceScreen).findPreference(KEY_PREF);
- mFeatureFactory = FakeFeatureFactory.setupForTest();
- mOldBatteryTips = new ArrayList<>();
mNewBatteryTips = new ArrayList<>();
mBatteryTipPreferenceController = buildBatteryTipPreferenceController();
@@ -87,32 +81,32 @@
}
@Test
- public void testDisplayPreference_isInvisible() {
+ public void displayPreference_isInvisible() {
mBatteryTipPreferenceController.displayPreference(mPreferenceScreen);
assertThat(mCardPreference.isVisible()).isFalse();
}
@Test
- public void testUpdateBatteryTips_tipsStateInvisible_isInvisible() {
+ public void updateBatteryTips_tipsStateInvisible_isInvisible() {
mBatteryTipPreferenceController.updateBatteryTips(mNewBatteryTips);
assertThat(mCardPreference.isVisible()).isFalse();
}
@Test
- public void testGetCurrentBatteryTip_noTips_isNull() {
+ public void getCurrentBatteryTip_noTips_isNull() {
assertThat(mBatteryTipPreferenceController.getCurrentBatteryTip()).isNull();
}
@Test
- public void testGetCurrentBatteryTip_tipsInvisible_isNull() {
+ public void getCurrentBatteryTip_tipsInvisible_isNull() {
mBatteryTipPreferenceController.updateBatteryTips(mNewBatteryTips);
assertThat(mBatteryTipPreferenceController.getCurrentBatteryTip()).isNull();
}
@Test
- public void testRestoreFromNull_shouldNotCrash() {
+ public void restoreFromNull_shouldNotCrash() {
final Bundle bundle = new Bundle();
// Battery tip list is null at this time
mBatteryTipPreferenceController.saveInstanceState(bundle);
@@ -124,7 +118,7 @@
}
@Test
- public void testHandlePreferenceTreeClick_noDialog_invokeCallback() {
+ public void handlePreferenceTreeClick_noDialog_invokeCallback() {
when(mBatteryTip.getType()).thenReturn(SMART_BATTERY_MANAGER);
List<BatteryTip> batteryTips = new ArrayList<>();
batteryTips.add(mBatteryTip);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java
index 8e3de7c..c5897f2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java
@@ -19,20 +19,25 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
+import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
+import android.os.PowerManager;
+
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.fuelgauge.BatteryInfo;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;
import java.util.concurrent.TimeUnit;
@@ -40,73 +45,79 @@
@RunWith(RobolectricTestRunner.class)
public class LowBatteryDetectorTest {
+ @Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
+
@Mock private BatteryInfo mBatteryInfo;
- private BatteryTipPolicy mPolicy;
+
+ private BatteryTipPolicy mBatteryTipPolicy;
private LowBatteryDetector mLowBatteryDetector;
private Context mContext;
+ private PowerManager mPowerManager;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
+ mContext = ApplicationProvider.getApplicationContext();
+ mBatteryTipPolicy = spy(new BatteryTipPolicy(mContext));
- mPolicy = spy(new BatteryTipPolicy(RuntimeEnvironment.application));
- mContext = RuntimeEnvironment.application;
- ReflectionHelpers.setField(mPolicy, "lowBatteryEnabled", true);
+ mPowerManager = mContext.getSystemService(PowerManager.class);
+ shadowOf(mPowerManager).setIsPowerSaveMode(false);
+
+ ReflectionHelpers.setField(mBatteryTipPolicy, "lowBatteryEnabled", true);
mBatteryInfo.discharging = true;
- mLowBatteryDetector =
- new LowBatteryDetector(
- mContext, mPolicy, mBatteryInfo, false /* isPowerSaveMode */);
+ mLowBatteryDetector = new LowBatteryDetector(mContext, mBatteryTipPolicy, mBatteryInfo);
}
@Test
- public void testDetect_disabledByPolicy_tipInvisible() {
- ReflectionHelpers.setField(mPolicy, "lowBatteryEnabled", false);
- mLowBatteryDetector =
- new LowBatteryDetector(mContext, mPolicy, mBatteryInfo, true /* isPowerSaveMode */);
+ public void detect_disabledByPolicy_tipInvisible() {
+ ReflectionHelpers.setField(mBatteryTipPolicy, "lowBatteryEnabled", false);
+ shadowOf(mPowerManager).setIsPowerSaveMode(true);
+ mLowBatteryDetector = new LowBatteryDetector(mContext, mBatteryTipPolicy, mBatteryInfo);
assertThat(mLowBatteryDetector.detect().isVisible()).isFalse();
}
@Test
- public void testDetect_enabledByTest_tipNew() {
- ReflectionHelpers.setField(mPolicy, "testLowBatteryTip", true);
+ public void detect_enabledByTest_tipNew() {
+ ReflectionHelpers.setField(mBatteryTipPolicy, "testLowBatteryTip", true);
assertThat(mLowBatteryDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
}
@Test
- public void testDetect_lowBattery_tipNew() {
+ public void detect_lowBattery_tipNew() {
mBatteryInfo.batteryLevel = 20;
mBatteryInfo.remainingTimeUs = TimeUnit.DAYS.toMillis(1);
+
assertThat(mLowBatteryDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
}
@Test
- public void testDetect_batterySaverOn_tipInvisible() {
- mLowBatteryDetector =
- new LowBatteryDetector(mContext, mPolicy, mBatteryInfo, true /* isPowerSaveMode */);
+ public void detect_batterySaverOn_tipInvisible() {
+ shadowOf(mPowerManager).setIsPowerSaveMode(true);
+ mLowBatteryDetector = new LowBatteryDetector(mContext, mBatteryTipPolicy, mBatteryInfo);
assertThat(mLowBatteryDetector.detect().getState())
.isEqualTo(BatteryTip.StateType.INVISIBLE);
}
@Test
- public void testDetect_charging_tipInvisible() {
+ public void detect_charging_tipInvisible() {
mBatteryInfo.discharging = false;
assertThat(mLowBatteryDetector.detect().isVisible()).isFalse();
}
@Test
- public void testDetect_lowTimeEstimation_tipInvisible() {
+ public void detect_lowTimeEstimation_tipInvisible() {
mBatteryInfo.batteryLevel = 50;
mBatteryInfo.remainingTimeUs = TimeUnit.MINUTES.toMillis(1);
+
assertThat(mLowBatteryDetector.detect().isVisible()).isFalse();
}
@Test
- public void testDetect_noEarlyWarning_tipInvisible() {
+ public void detect_noEarlyWarning_tipInvisible() {
mBatteryInfo.remainingTimeUs = TimeUnit.DAYS.toMicros(1);
mBatteryInfo.batteryLevel = 100;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
index 296306d..4efd850 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
@@ -17,8 +17,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -27,6 +25,7 @@
import android.util.Log;
import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
@@ -34,12 +33,13 @@
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowLog;
@RunWith(RobolectricTestRunner.class)
@@ -49,23 +49,22 @@
private FakeFeatureFactory mFeatureFactory;
private BatteryDefenderTip mBatteryDefenderTip;
private MetricsFeatureProvider mMetricsFeatureProvider;
+ private CardPreference mCardPreference;
+ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock private BatteryTip mBatteryTip;
@Mock private Preference mPreference;
- @Mock private CardPreference mCardPreference;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
-
+ mContext = ApplicationProvider.getApplicationContext();
mFeatureFactory = FakeFeatureFactory.setupForTest();
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
- mContext = RuntimeEnvironment.application;
mBatteryDefenderTip =
- new BatteryDefenderTip(BatteryTip.StateType.NEW, false /* isPluggedIn */);
+ new BatteryDefenderTip(BatteryTip.StateType.NEW, /* isPluggedIn= */ false);
+ mCardPreference = new CardPreference(mContext);
when(mPreference.getContext()).thenReturn(mContext);
- when(mCardPreference.getContext()).thenReturn(mContext);
}
@Test
@@ -87,7 +86,7 @@
}
@Test
- public void testLog_logMetric() {
+ public void log_logMetric() {
mBatteryDefenderTip.updateState(mBatteryTip);
mBatteryDefenderTip.log(mContext, mMetricsFeatureProvider);
@@ -108,7 +107,7 @@
mBatteryDefenderTip.updatePreference(mCardPreference);
- verify(mCardPreference).setPrimaryButtonText(expectedText);
+ assertThat(mCardPreference.getPrimaryButtonText()).isEqualTo(expectedText);
}
@Test
@@ -117,46 +116,31 @@
mBatteryDefenderTip.updatePreference(mCardPreference);
- verify(mCardPreference).setSecondaryButtonText(expected);
+ assertThat(mCardPreference.getSecondaryButtonText()).isEqualTo(expected);
}
@Test
public void updatePreference_shouldSetPrimaryButtonVisible() {
mBatteryDefenderTip.updatePreference(mCardPreference);
- verify(mCardPreference).setPrimaryButtonVisible(true);
+ assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
}
@Test
public void updatePreference_whenCharging_setPrimaryButtonVisibleToBeTrue() {
mBatteryDefenderTip =
- new BatteryDefenderTip(BatteryTip.StateType.NEW, true /* isPluggedIn */);
+ new BatteryDefenderTip(BatteryTip.StateType.NEW, /* isPluggedIn= */ true);
mBatteryDefenderTip.updatePreference(mCardPreference);
- verify(mCardPreference).setPrimaryButtonVisible(true);
+ assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
}
@Test
public void updatePreference_whenNotCharging_setSecondaryButtonVisibleToBeFalse() {
mBatteryDefenderTip.updatePreference(mCardPreference);
- verify(mCardPreference).setSecondaryButtonVisible(false);
- }
-
- @Test
- public void updatePreference_whenGetChargingStatusFailed_setSecondaryButtonVisibleToBeFalse() {
- fakeGetChargingStatusFailed();
-
- mBatteryDefenderTip.updatePreference(mCardPreference);
-
- verify(mCardPreference).setSecondaryButtonVisible(false);
- }
-
- private void fakeGetChargingStatusFailed() {
- Context mockContext = mock(Context.class);
- when(mockContext.getString(anyInt())).thenReturn("fake_string");
- when(mCardPreference.getContext()).thenReturn(mockContext);
+ assertThat(mCardPreference.getSecondaryButtonVisibility()).isFalse();
}
private String getLastErrorLog() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
index 45fdc1f..097f484 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
@@ -20,11 +20,10 @@
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
-import android.view.View;
import androidx.annotation.DrawableRes;
import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.widget.CardPreference;
@@ -32,10 +31,12 @@
import com.android.settingslib.testutils.DrawableTestHelper;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.List;
@@ -47,13 +48,15 @@
private static final String SUMMARY = "summary";
@DrawableRes private static final int ICON_ID = R.drawable.ic_fingerprint;
+ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
private Context mContext;
private TestBatteryTip mBatteryTip;
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
mBatteryTip = new TestBatteryTip();
+ mContext = ApplicationProvider.getApplicationContext();
}
@Test
@@ -84,19 +87,14 @@
@Test
public void updatePreference_resetLayoutState() {
- mContext.setTheme(R.style.Theme_Settings);
- PreferenceViewHolder holder =
- PreferenceViewHolder.createInstanceForTests(
- View.inflate(
- mContext, R.layout.card_preference_layout, /* parent= */ null));
CardPreference cardPreference = new CardPreference(mContext);
- cardPreference.onBindViewHolder(holder);
- cardPreference.setPrimaryButtonVisible(true);
+ cardPreference.setPrimaryButtonVisibility(true);
+ cardPreference.setSecondaryButtonVisibility(true);
mBatteryTip.updatePreference(cardPreference);
- View view = holder.findViewById(R.id.card_preference_buttons);
- assertThat(view.getVisibility()).isEqualTo(View.GONE);
+ assertThat(cardPreference.getPrimaryButtonVisibility()).isFalse();
+ assertThat(cardPreference.getSecondaryButtonVisibility()).isFalse();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
index c1d039b..7a23332 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
@@ -25,6 +25,7 @@
import android.util.Log;
import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
@@ -32,12 +33,13 @@
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowLog;
@RunWith(RobolectricTestRunner.class)
@@ -47,22 +49,21 @@
private FakeFeatureFactory mFeatureFactory;
private IncompatibleChargerTip mIncompatibleChargerTip;
private MetricsFeatureProvider mMetricsFeatureProvider;
+ private CardPreference mCardPreference;
+ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock private BatteryTip mBatteryTip;
@Mock private Preference mPreference;
- @Mock private CardPreference mCardPreference;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
-
mFeatureFactory = FakeFeatureFactory.setupForTest();
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mIncompatibleChargerTip = new IncompatibleChargerTip(BatteryTip.StateType.NEW);
+ mCardPreference = new CardPreference(mContext);
when(mPreference.getContext()).thenReturn(mContext);
- when(mCardPreference.getContext()).thenReturn(mContext);
}
@Test
@@ -107,13 +108,13 @@
mIncompatibleChargerTip.updatePreference(mCardPreference);
- verify(mCardPreference).setPrimaryButtonText(expected);
+ assertThat(mCardPreference.getPrimaryButtonText()).isEqualTo(expected);
}
@Test
public void updatePreference_shouldSetSecondaryButtonVisible() {
mIncompatibleChargerTip.updatePreference(mCardPreference);
- verify(mCardPreference).setPrimaryButtonVisible(true);
+ assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
}
private String getLastErrorLog() {
diff --git a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java
deleted file mode 100644
index e26643f..0000000
--- a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *Visibility_setGoneForPrimaryButton_buttonGroupIsGone
- * 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.widget;
-
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-
-import android.content.Context;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.preference.PreferenceViewHolder;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class CardPreferenceTest {
-
- private CardPreference mCardPreference;
- private PreferenceViewHolder mHolder;
-
- @Before
- public void setUp() {
- Context context = ApplicationProvider.getApplicationContext();
- context.setTheme(R.style.Theme_Settings);
- mCardPreference = new CardPreference(context);
-
- mHolder = PreferenceViewHolder.createInstanceForTests(
- View.inflate(context, R.layout.card_preference_layout, /* parent= */ null));
- }
-
- @Test
- public void newACardPreference_layoutResourceShouldBeCardPreferenceLayout() {
- Context context = ApplicationProvider.getApplicationContext();
- context.setTheme(R.style.SettingsPreferenceTheme);
-
- CardPreference cardPreference = new CardPreference(context);
-
- assertThat(cardPreference.getLayoutResource()).isEqualTo(R.layout.card_preference_layout);
- }
-
- @Test
- public void onBindViewHolder_noButtonVisible_buttonsLayoutIsGone() {
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
- }
-
- @Test
- public void onBindViewHolder_setPrimaryButtonVisibility_buttonsLayoutIsVisible() {
- mCardPreference.setPrimaryButtonVisible(true);
-
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_setPrimaryButtonVisibilityToVisible() {
- mCardPreference.setPrimaryButtonVisible(true);
-
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_setSecondaryButtonVisibility_buttonsLayoutIsVisible() {
- mCardPreference.setSecondaryButtonVisible(true);
-
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_setSecondaryButtonVisibilityToVisible() {
- mCardPreference.setSecondaryButtonVisible(true);
-
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE);
- }
-
- @Test
- public void onBindViewHolder_setPrimaryButtonTextToExpectedText() {
- String expectedText = "primary-button";
- mCardPreference.setPrimaryButtonText(expectedText);
-
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText);
- }
-
- @Test
- public void onBindViewHolder_setSecondaryButtonTextToExpectedText() {
- String expectedText = "secondary-button";
- mCardPreference.setSecondaryButtonText(expectedText);
-
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText);
- }
-
- @Test
- public void onBindViewHolder_initialTextForPrimaryButtonShouldBeEmpty() {
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getPrimaryButton().getText().toString()).isEqualTo("");
- }
-
- @Test
- public void onBindViewHolder_initialTextForSecondaryButtonShouldBeEmpty() {
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getSecondaryButton().getText().toString()).isEqualTo("");
- }
-
- @Test
- public void performClickOnPrimaryButton_callClickListener() {
- final boolean[] hasCalled = {false};
- View.OnClickListener clickListener = v -> hasCalled[0] = true;
- mCardPreference.setPrimaryButtonClickListener(clickListener);
-
- mCardPreference.onBindViewHolder(mHolder);
- getPrimaryButton().performClick();
-
- assertThat(hasCalled[0]).isTrue();
- }
-
- @Test
- public void performClickOnSecondaryButton_callClickListener() {
- final boolean[] hasCalled = {false};
- View.OnClickListener clickListener = v -> hasCalled[0] = true;
- mCardPreference.setSecondaryButtonClickListener(clickListener);
-
- mCardPreference.onBindViewHolder(mHolder);
- getSecondaryButton().performClick();
-
- assertThat(hasCalled[0]).isTrue();
- }
-
- @Test
- public void onBindViewHolder_primaryButtonDefaultIsGone() {
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getPrimaryButton().getVisibility()).isEqualTo(GONE);
- }
-
- @Test
- public void onBindViewHolder_secondaryButtonDefaultIsGone() {
- mCardPreference.onBindViewHolder(mHolder);
-
- assertThat(getSecondaryButton().getVisibility()).isEqualTo(GONE);
- }
-
- @Test
- public void setPrimaryButtonVisibility_setTrueAfterBindViewHolder_isVisible() {
- mCardPreference.setPrimaryButtonVisible(false);
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setPrimaryButtonVisible(true);
-
- assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE);
- }
-
- @Test
- public void setPrimaryButtonText_setAfterBindViewHolder_setOnUi() {
- String expectedText = "123456";
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setPrimaryButtonText(expectedText);
-
- assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText);
- }
-
- @Test
- public void setPrimaryButtonText_setNull_isEmptyText() {
- final String emptyString = "";
- mCardPreference.setPrimaryButtonText("1234");
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setPrimaryButtonText(null);
-
- assertThat(getPrimaryButton().getText().toString()).isEqualTo(emptyString);
- }
-
- @Test
- public void setPrimaryButtonClickListener_setAfterOnBindViewHolder() {
- final String[] hasCalled = {""};
- String expectedClickedResult = "was called";
- View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult;
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setPrimaryButtonClickListener(clickListener);
- getPrimaryButton().performClick();
-
- assertThat(hasCalled[0]).isEqualTo(expectedClickedResult);
- }
-
- @Test
- public void setPrimaryButtonClickListener_setNull_clearTheOnClickListener() {
- final String[] hasCalled = {"not called"};
- View.OnClickListener clickListener = v -> hasCalled[0] = "called once";
- mCardPreference.setPrimaryButtonClickListener(clickListener);
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setPrimaryButtonClickListener(null);
- getPrimaryButton().performClick();
-
- assertThat(hasCalled[0]).isEqualTo("not called");
- }
-
- @Test
- public void setSecondaryButtonVisibility_setTrueAfterBindViewHolder_isVisible() {
- mCardPreference.setSecondaryButtonVisible(false);
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setSecondaryButtonVisible(true);
-
- assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE);
- }
-
- @Test
- public void setSecondaryButtonText_setAfterBindViewHolder_setOnUi() {
- String expectedText = "10101010";
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setSecondaryButtonText(expectedText);
-
- assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText);
- }
-
- @Test
- public void setSecondaryButtonText_setNull_isEmptyText() {
- String emptyString = "";
- mCardPreference.setSecondaryButtonText("1234");
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setSecondaryButtonText(null);
-
- assertThat(getSecondaryButton().getText().toString()).isEqualTo(emptyString);
- }
-
- @Test
- public void setSecondaryButtonClickListener_setAfterOnBindViewHolder() {
- final String[] hasCalled = {""};
- String expectedClickedResult = "2nd was called";
- View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult;
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setSecondaryButtonClickListener(clickListener);
- getSecondaryButton().performClick();
-
- assertThat(hasCalled[0]).isEqualTo(expectedClickedResult);
- }
-
- @Test
- public void setSecondaryButtonClickListener_setNull_clearTheOnClickListener() {
- final String[] hasCalled = {"not called"};
- View.OnClickListener clickListener = v -> hasCalled[0] = "called once";
- mCardPreference.setSecondaryButtonClickListener(clickListener);
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.setSecondaryButtonClickListener(null);
- getSecondaryButton().performClick();
-
- assertThat(hasCalled[0]).isEqualTo("not called");
- }
-
- @Test
- public void setPrimaryButtonVisibility_setGoneForSecondaryButton_buttonGroupIsGone() {
- mCardPreference.setPrimaryButtonVisible(true);
- mCardPreference.setSecondaryButtonVisible(false);
- mCardPreference.onBindViewHolder(mHolder);
- assertWithMessage("PreCondition: buttonsView should be Visible")
- .that(getCardPreferenceButtonsView().getVisibility())
- .isEqualTo(VISIBLE);
-
- mCardPreference.setPrimaryButtonVisible(false);
-
- assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
- }
-
- @Test
- public void setSecondaryButtonVisibility_setGoneForPrimaryButton_buttonGroupIsGone() {
- mCardPreference.setPrimaryButtonVisible(false);
- mCardPreference.setSecondaryButtonVisible(true);
- mCardPreference.onBindViewHolder(mHolder);
- assertWithMessage("PreCondition: buttonsView should be Visible")
- .that(getCardPreferenceButtonsView().getVisibility())
- .isEqualTo(VISIBLE);
-
- mCardPreference.setSecondaryButtonVisible(false);
-
- assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
- }
-
- @Test
- public void resetLayoutState_buttonGroupIsGone() {
- mCardPreference.setPrimaryButtonVisible(true);
- mCardPreference.setSecondaryButtonVisible(true);
- mCardPreference.onBindViewHolder(mHolder);
-
- mCardPreference.resetLayoutState();
-
- assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
- }
-
- private View getCardPreferenceButtonsView() {
- return mHolder.findViewById(R.id.card_preference_buttons);
- }
-
- private Button getPrimaryButton() {
- return (Button) mHolder.findViewById(android.R.id.button1);
- }
-
- private Button getSecondaryButton() {
- return (Button) mHolder.findViewById(android.R.id.button2);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
index 2e6189e..4497a0a 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
@@ -40,7 +40,10 @@
import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.telephony.CarrierConfigManager;
+import android.telephony.NetworkRegistrationInfo;
+import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsMmTelManager;
import android.view.View;
@@ -48,6 +51,7 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
+import com.android.internal.telephony.flags.Flags;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.network.ims.MockWifiCallingQueryImsState;
@@ -57,6 +61,7 @@
import com.android.settings.widget.SettingsMainSwitchPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -70,6 +75,7 @@
@Config(shadows = ShadowFragment.class)
@RunWith(RobolectricTestRunner.class)
public class WifiCallingSettingsForSubTest {
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final int SUB_ID = 2;
private static final String SWITCH_BAR = "wifi_calling_switch_bar";
@@ -158,6 +164,7 @@
mFragment.onAttach(mContext);
mFragment.onCreate(null);
mFragment.onActivityCreated(null);
+ mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
}
private void setDefaultCarrierConfigValues() {
@@ -241,6 +248,31 @@
}
@Test
+ public void onResume_overrideWfcRoamingModeWhileUsingNTN_shouldDisableWfcRoaming() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
+ mBundle.putBoolean(
+ CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, false);
+ mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, true);
+ mBundle.putBoolean(
+ CarrierConfigManager.KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL, true);
+
+ // Phone connected to non-terrestrial network
+ NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
+ .setIsNonTerrestrialNetwork(true)
+ .build();
+ ServiceState ss = new ServiceState();
+ ss.addNetworkRegistrationInfo(nri);
+ doReturn(ss).when(mTelephonyManager).getServiceState();
+
+ // Call onResume to update the WFC roaming preference.
+ mFragment.onResume();
+
+ // Check that WFC roaming preference is visible but disabled
+ verify(mButtonWfcRoamingMode, times(1)).setEnabled(false);
+ verify(mButtonWfcRoamingMode, times(1)).setVisible(true);
+ }
+
+ @Test
public void onResume_useWfcHomeModeConfigTrueAndNotEditable_shouldHideWfcRoaming() {
mBundle.putBoolean(
CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, true);
diff --git a/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
new file mode 100644
index 0000000..bb30619
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
@@ -0,0 +1,151 @@
+/*
+ * 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.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import android.provider.Settings
+import android.provider.Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import androidx.preference.SwitchPreference
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
+import com.android.server.notification.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION
+import com.android.settings.development.SensitiveContentProtectionPreferenceController.Companion.SETTING_VALUE_OFF
+import com.android.settings.development.SensitiveContentProtectionPreferenceController.Companion.SETTING_VALUE_ON
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.junit.MockitoJUnit
+import org.mockito.Mockito.`when` as whenever
+
+@RunWith(AndroidJUnit4::class)
+class SensitiveContentProtectionPreferenceControllerTest {
+ @get:Rule
+ val mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+ @get:Rule
+ val mocks = MockitoJUnit.rule()
+
+ @Mock
+ private lateinit var preference: SwitchPreference
+
+ @Mock
+ private lateinit var screen: PreferenceScreen
+
+ private val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
+ private lateinit var controller: SensitiveContentProtectionPreferenceController
+
+ @Before
+ fun setUp() {
+ controller = SensitiveContentProtectionPreferenceController(context)
+ whenever(screen.findPreference<Preference>(controller.getPreferenceKey()))
+ .thenReturn(preference)
+ controller.displayPreference(screen)
+ }
+
+ @Test
+ fun onPreferenceChange_settingEnabled_shouldDisableSensitiveContentProtection() {
+ controller.onPreferenceChange(preference, true /* new value */)
+ val mode = Settings.Global.getInt(
+ context.contentResolver,
+ DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ -1 /* default */
+ )
+
+ assertEquals(mode, SETTING_VALUE_ON)
+ }
+
+ @Test
+ fun onPreferenceChange_settingDisabled_shouldEnableSensitiveContentProtection() {
+ controller.onPreferenceChange(preference, false /* new value */)
+ val mode = Settings.Global.getInt(
+ context.contentResolver,
+ DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ -1 /* default */
+ )
+
+ assertEquals(mode, SETTING_VALUE_OFF)
+ }
+
+ @Test
+ fun updateState_settingEnabled_preferenceShouldBeChecked() {
+ Settings.Global.putInt(
+ context.contentResolver,
+ DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ SETTING_VALUE_ON
+ )
+ controller.updateState(preference)
+
+ verify(preference).isChecked = true
+ }
+
+ @Test
+ fun updateState_settingDisabled_preferenceShouldNotBeChecked() {
+ Settings.Global.putInt(
+ context.contentResolver,
+ DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ SETTING_VALUE_OFF
+ )
+ controller.updateState(preference)
+
+ verify(preference).isChecked = false
+ }
+
+ @Test
+ fun onDeveloperOptionsSwitchDisabled_preferenceShouldBeDisabled() {
+ controller.onDeveloperOptionsSwitchDisabled()
+ val mode = Settings.Global.getInt(
+ context.contentResolver,
+ DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS,
+ -1 /* default */
+ )
+
+ assertEquals(mode, SETTING_VALUE_OFF)
+ verify(preference).isChecked = false
+ verify(preference).isEnabled = false
+ }
+
+ @Test
+ @RequiresFlagsDisabled(
+ FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION,
+ FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+ fun isAvailable_flagsDisabled_returnFalse() {
+ assertFalse(controller.isAvailable)
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION)
+ fun isAvailable_sensitiveNotificationAppProtectionEnabled_returnTrue() {
+ assertTrue(controller.isAvailable)
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+ fun isAvailable_screenshareNotificationHidingEnabled_returnTrue() {
+ assertTrue(controller.isAvailable)
+ }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceControllerTest.kt
new file mode 100644
index 0000000..b035af5
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceControllerTest.kt
@@ -0,0 +1,160 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.platform.test.flag.junit.SetFlagsRule
+import android.telephony.SubscriptionInfo
+import android.telephony.TelephonyManager
+import android.telephony.euicc.EuiccManager
+import androidx.fragment.app.Fragment
+import androidx.preference.PreferenceManager
+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.core.BasePreferenceController
+import com.android.settings.flags.Flags
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.android.settingslib.CustomDialogPreferenceCompat
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoSession
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+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 MobileNetworkEidPreferenceControllerTest {
+ @get:Rule val setFlagsRule: SetFlagsRule = SetFlagsRule()
+
+ private lateinit var mockSession: MockitoSession
+
+ private val mockViewModels = mock<Lazy<SubscriptionInfoListViewModel>>()
+ private val mockFragment = mock<Fragment>{
+ val viewmodel = mockViewModels
+ }
+
+ private var mockEid = String()
+ private val mockTelephonyManager = mock<TelephonyManager> {
+ on {uiccCardsInfo} doReturn listOf()
+ on { createForSubscriptionId(any()) } doReturn mock
+ }
+ private val mockEuiccManager = mock<EuiccManager> {
+ on {isEnabled} doReturn true
+ on {eid} doReturn mockEid
+ }
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
+ on { getSystemService(EuiccManager::class.java) } doReturn mockEuiccManager
+ }
+
+ private val controller = MobileNetworkEidPreferenceController(context, TEST_KEY)
+ private val preference = CustomDialogPreferenceCompat(context).apply { key = TEST_KEY }
+ private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(SubscriptionUtil::class.java)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+
+ preferenceScreen.addPreference(preference)
+ controller.displayPreference(preferenceScreen)
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun refreshData_getEmptyEid_preferenceIsNotVisible() = runBlocking {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
+ whenever(SubscriptionUtil.getActiveSubscriptions(any())).thenReturn(
+ listOf(
+ SUB_INFO_1,
+ SUB_INFO_2
+ )
+ )
+ var mockSubId = 2
+ controller.init(mockFragment, mockSubId)
+ mockEid = String()
+
+ controller.refreshData(SUB_INFO_2)
+
+ assertThat(preference.isVisible).isEqualTo(false)
+ }
+
+ @Test
+ fun refreshData_getEmptyEid_preferenceSummaryIsExpected() = runBlocking {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
+ whenever(SubscriptionUtil.getActiveSubscriptions(any())).thenReturn(
+ listOf(
+ SUB_INFO_1,
+ SUB_INFO_2
+ )
+ )
+ var mockSubId = 2
+ controller.init(mockFragment, mockSubId)
+ mockEid = "test eid"
+ mockEuiccManager.stub {
+ on {eid} doReturn mockEid
+ }
+
+ controller.refreshData(SUB_INFO_2)
+
+ assertThat(preference.summary).isEqualTo(mockEid)
+ }
+
+ @Test
+ fun getAvailabilityStatus_notSimHardwareVisible() {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false)
+
+ val availabilityStatus = controller.availabilityStatus
+
+ assertThat(availabilityStatus).isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE)
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val DISPLAY_NAME_1 = "Sub 1"
+ const val DISPLAY_NAME_2 = "Sub 2"
+
+ val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(1)
+ setDisplayName(DISPLAY_NAME_1)
+ }.build()
+
+ val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(2)
+ setDisplayName(DISPLAY_NAME_2)
+ }.build()
+
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceControllerTest.kt
new file mode 100644
index 0000000..2f67846
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceControllerTest.kt
@@ -0,0 +1,138 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import android.telephony.TelephonyManager
+import android.telephony.euicc.EuiccManager
+import androidx.fragment.app.Fragment
+import androidx.preference.Preference
+import androidx.preference.PreferenceManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.dx.mockito.inline.extended.ExtendedMockito
+import com.android.internal.telephony.PhoneConstants
+import com.android.settings.core.BasePreferenceController
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.android.settingslib.CustomDialogPreferenceCompat
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoSession
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+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 MobileNetworkImeiPreferenceControllerTest {
+ private lateinit var mockSession: MockitoSession
+
+ private val mockViewModels = mock<Lazy<SubscriptionInfoListViewModel>>()
+ private val mockFragment = mock<Fragment>{
+ val viewmodel = mockViewModels
+ }
+
+ private var mockImei = String()
+ private val mockTelephonyManager = mock<TelephonyManager> {
+ on { uiccCardsInfo } doReturn listOf()
+ on { createForSubscriptionId(any()) } doReturn mock
+ on { currentPhoneType } doReturn TelephonyManager.PHONE_TYPE_GSM
+ on { imei } doReturn mockImei
+ on { meid } doReturn mockImei
+ }
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
+ }
+
+ private val controller = MobileNetworkImeiPreferenceController(context, TEST_KEY)
+ private val preference = Preference(context).apply { key = TEST_KEY }
+ private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(SubscriptionUtil::class.java)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+
+ preferenceScreen.addPreference(preference)
+ controller.displayPreference(preferenceScreen)
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun refreshData_getPhoneNumber_preferenceSummaryIsExpected() = runBlocking {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
+ whenever(SubscriptionUtil.getActiveSubscriptions(any())).thenReturn(
+ listOf(
+ SUB_INFO_1,
+ SUB_INFO_2
+ )
+ )
+ var mockSubId = 2
+ controller.init(mockFragment, mockSubId)
+ mockImei = "test imei"
+ mockTelephonyManager.stub {
+ on { imei } doReturn mockImei
+ }
+
+ controller.refreshData(SUB_INFO_2)
+
+ assertThat(preference.summary).isEqualTo(mockImei)
+ }
+
+ @Test
+ fun getAvailabilityStatus_notSimHardwareVisible() {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false)
+
+ val availabilityStatus = controller.availabilityStatus
+
+ assertThat(availabilityStatus).isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE)
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val DISPLAY_NAME_1 = "Sub 1"
+ const val DISPLAY_NAME_2 = "Sub 2"
+
+ val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(1)
+ setDisplayName(DISPLAY_NAME_1)
+ }.build()
+
+ val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(2)
+ setDisplayName(DISPLAY_NAME_2)
+ }.build()
+
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt
new file mode 100644
index 0000000..38c47c2
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt
@@ -0,0 +1,140 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import androidx.fragment.app.Fragment
+import androidx.preference.Preference
+import androidx.preference.PreferenceManager
+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.R
+import com.android.settings.core.BasePreferenceController
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoSession
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+import org.mockito.quality.Strictness
+
+@RunWith(AndroidJUnit4::class)
+class MobileNetworkPhoneNumberPreferenceControllerTest {
+ private lateinit var mockSession: MockitoSession
+
+ private val mockViewModels = mock<Lazy<SubscriptionInfoListViewModel>>()
+ private val mockFragment = mock<Fragment>{
+ val viewmodel = mockViewModels
+ }
+
+ private var mockPhoneNumber = String()
+ private val context: Context = ApplicationProvider.getApplicationContext()
+ private val controller = MobileNetworkPhoneNumberPreferenceController(context, TEST_KEY)
+ private val preference = Preference(context).apply { key = TEST_KEY }
+ private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(SubscriptionUtil::class.java)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+
+ preferenceScreen.addPreference(preference)
+ controller.displayPreference(preferenceScreen)
+
+ whenever(SubscriptionUtil.getBidiFormattedPhoneNumber(any(),any())).thenReturn(mockPhoneNumber)
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun refreshData_getEmptyPhoneNumber_preferenceIsNotVisible() = runBlocking {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
+ whenever(SubscriptionUtil.getActiveSubscriptions(any())).thenReturn(
+ listOf(
+ SUB_INFO_1,
+ SUB_INFO_2
+ )
+ )
+ var mockSubId = 2
+ controller.init(mockFragment, mockSubId)
+ mockPhoneNumber = String()
+
+ controller.refreshData(SUB_INFO_2)
+
+ assertThat(preference.summary).isEqualTo(
+ context.getString(R.string.device_info_default))
+ }
+
+ @Test
+ fun refreshData_getPhoneNumber_preferenceSummaryIsExpected() = runBlocking {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
+ whenever(SubscriptionUtil.getActiveSubscriptions(any())).thenReturn(
+ listOf(
+ SUB_INFO_1,
+ SUB_INFO_2
+ )
+ )
+ var mockSubId = 2
+ controller.init(mockFragment, mockSubId)
+ mockPhoneNumber = "test phone number"
+ whenever(SubscriptionUtil.getBidiFormattedPhoneNumber(any(),any())).thenReturn(mockPhoneNumber)
+
+ controller.refreshData(SUB_INFO_2)
+
+ assertThat(preference.summary).isEqualTo(mockPhoneNumber)
+ }
+
+ @Test
+ fun getAvailabilityStatus_notSimHardwareVisible() {
+ whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false)
+
+ val availabilityStatus = controller.availabilityStatus
+
+ assertThat(availabilityStatus).isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE)
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val DISPLAY_NAME_1 = "Sub 1"
+ const val DISPLAY_NAME_2 = "Sub 2"
+
+ val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(1)
+ setDisplayName(DISPLAY_NAME_1)
+ }.build()
+
+ val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(2)
+ setDisplayName(DISPLAY_NAME_2)
+ }.build()
+
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceControllerTest.kt
new file mode 100644
index 0000000..f5592c1
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceControllerTest.kt
@@ -0,0 +1,108 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import android.telephony.TelephonyManager
+import android.telephony.euicc.EuiccManager
+import androidx.fragment.app.Fragment
+import androidx.preference.Preference
+import androidx.preference.PreferenceManager
+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.core.BasePreferenceController
+import com.android.settings.network.SubscriptionInfoListViewModel
+import com.android.settings.network.SubscriptionUtil
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoSession
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.whenever
+import org.mockito.quality.Strictness
+
+@RunWith(AndroidJUnit4::class)
+class MobileNetworkSpnPreferenceControllerTest {
+ private lateinit var mockSession: MockitoSession
+
+ private val mockViewModels = mock<Lazy<SubscriptionInfoListViewModel>>()
+ private val mockFragment = mock<Fragment>{
+ val viewmodel = mockViewModels
+ }
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+ private val controller = MobileNetworkSpnPreferenceController(context, TEST_KEY)
+ private val preference = Preference(context).apply { key = TEST_KEY }
+ private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(SubscriptionUtil::class.java)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+
+ preferenceScreen.addPreference(preference)
+ controller.displayPreference(preferenceScreen)
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun refreshData_getCarrierName_preferenceSummaryIsExpected() = runBlocking {
+ var testList = listOf(
+ SUB_INFO_1,
+ SUB_INFO_2
+ )
+ whenever(SubscriptionUtil.getActiveSubscriptions(any())).thenReturn(testList)
+ var mockSubId = 2
+ controller.init(mockFragment, mockSubId)
+
+ controller.refreshData(testList)
+
+ assertThat(preference.summary).isEqualTo(CARRIER_NAME_2)
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val CARRIER_NAME_1 = "Sub 1"
+ const val CARRIER_NAME_2 = "Sub 2"
+
+ val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(1)
+ setCarrierName(CARRIER_NAME_1)
+ }.build()
+
+ val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(2)
+ setCarrierName(CARRIER_NAME_2)
+ }.build()
+
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt
index 74aa861..537764a 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt
@@ -21,7 +21,6 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.lifecycle.MutableLiveData
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
@@ -270,7 +269,7 @@
private class FakeAppOpsController(private val fakeMode: Int) : IAppOpsController {
var setAllowedCalledWith: Boolean? = null
- override val mode = MutableLiveData(fakeMode)
+ override val mode = flowOf(fakeMode)
override fun setAllowed(allowed: Boolean) {
setAllowedCalledWith = allowed
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonRepositoryTest.kt
index 49b60fb..1eb1a7f 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonRepositoryTest.kt
@@ -20,8 +20,11 @@
import android.content.ComponentName
import android.content.Context
import android.content.pm.ActivityInfo
+import android.content.pm.ApplicationInfo
+import android.content.pm.Flags
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
+import android.platform.test.annotations.RequiresFlagsEnabled
import androidx.core.os.bundleOf
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -126,9 +129,62 @@
assertThat(homePackageInfo.homePackages).containsExactly(PACKAGE_NAME)
}
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_IMPROVE_HOME_APP_BEHAVIOR)
+ fun uninstallDisallowedDueToHomeApp_isNotSystemAndIsCurrentHomeAndHasOnlyOneHomeApp() {
+ val app = ApplicationInfo().apply {
+ packageName = PACKAGE_NAME
+ }
+
+ mockGetHomeActivities(
+ homeActivities = listOf(RESOLVE_INFO),
+ currentDefaultHome = COMPONENT_NAME,
+ )
+
+ val value = appButtonRepository.uninstallDisallowedDueToHomeApp(app)
+
+ assertThat(value).isTrue()
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_IMPROVE_HOME_APP_BEHAVIOR)
+ fun uninstallDisallowedDueToHomeApp_isNotSystemAndIsCurrentHomeAndHasOtherHomeApps() {
+ val app = ApplicationInfo().apply {
+ packageName = PACKAGE_NAME
+ }
+
+ mockGetHomeActivities(
+ homeActivities = listOf(RESOLVE_INFO, RESOLVE_INFO_FAKE),
+ currentDefaultHome = COMPONENT_NAME,
+ )
+
+ val value = appButtonRepository.uninstallDisallowedDueToHomeApp(app)
+
+ assertThat(value).isFalse()
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_IMPROVE_HOME_APP_BEHAVIOR)
+ fun uninstallDisallowedDueToHomeApp_isSystemAndIsCurrentHomeAndHasOtherHomeApps() {
+ val app = ApplicationInfo().apply {
+ packageName = PACKAGE_NAME
+ flags = ApplicationInfo.FLAG_SYSTEM
+ }
+
+ mockGetHomeActivities(
+ homeActivities = listOf(RESOLVE_INFO, RESOLVE_INFO_FAKE),
+ currentDefaultHome = COMPONENT_NAME,
+ )
+
+ val value = appButtonRepository.uninstallDisallowedDueToHomeApp(app)
+
+ assertThat(value).isTrue()
+ }
+
private companion object {
const val PACKAGE_NAME = "packageName"
const val PACKAGE_NAME_ALTERNATE = "packageName.alternate"
+ const val PACKAGE_NAME_FAKE = "packageName.fake"
const val ACTIVITY_NAME = "activityName"
val COMPONENT_NAME = ComponentName(PACKAGE_NAME, ACTIVITY_NAME)
val RESOLVE_INFO = ResolveInfo().apply {
@@ -136,6 +192,11 @@
packageName = PACKAGE_NAME
}
}
+ val RESOLVE_INFO_FAKE = ResolveInfo().apply {
+ activityInfo = ActivityInfo().apply {
+ packageName = PACKAGE_NAME_FAKE
+ }
+ }
val RESOLVE_INFO_WITH_ALTERNATE = ResolveInfo().apply {
activityInfo = ActivityInfo().apply {
packageName = PACKAGE_NAME
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt
index cc2c1e1..b61e3a9 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt
@@ -24,8 +24,9 @@
import android.apphibernation.AppHibernationManager
import android.content.Context
import android.content.pm.ApplicationInfo
-import android.content.pm.Flags
+import android.content.pm.Flags as PmFlags
import android.os.Build
+import android.os.SystemProperties
import android.permission.PermissionControllerManager
import android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_ELIGIBLE
import android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM
@@ -48,6 +49,7 @@
import com.android.settings.R
import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED
import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS
+import com.android.settings.flags.Flags
import com.android.settings.testutils.TestDeviceConfig
import com.android.settings.testutils.mockAsUser
import com.android.settingslib.spaprivileged.framework.common.appHibernationManager
@@ -161,8 +163,8 @@
}
private fun isArchivingEnabled() =
- Flags.archiving() || "true" == System.getProperty("pm.archiving.enabled")
-
+ PmFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
+ || Flags.appArchiving()
@Test
fun `An app targets Q with ops mode default when hibernation targets pre S - not exempted`() {
mockOpsMode(MODE_DEFAULT)
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaRoutingControlTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaRoutingControlTest.kt
index 2f4740e..990ec5c 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaRoutingControlTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaRoutingControlTest.kt
@@ -24,7 +24,6 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import android.platform.test.flag.junit.SetFlagsRule
-import androidx.lifecycle.MutableLiveData
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.media.flags.Flags
@@ -33,6 +32,7 @@
import com.android.settingslib.spaprivileged.model.app.IAppOpsController
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -223,16 +223,13 @@
private class FakeAppOpsController(fakeMode: Int) : IAppOpsController {
- override val mode = MutableLiveData(fakeMode)
+ override val mode = MutableStateFlow(fakeMode)
override fun setAllowed(allowed: Boolean) {
- if (allowed)
- mode.postValue(AppOpsManager.MODE_ALLOWED)
- else
- mode.postValue(AppOpsManager.MODE_ERRORED)
+ mode.value = if (allowed) AppOpsManager.MODE_ALLOWED else AppOpsManager.MODE_ERRORED
}
- override fun getMode(): Int = mode.value!!
+ override fun getMode(): Int = mode.value
}
companion object {
diff --git a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingLabelSimTest.kt b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingLabelSimTest.kt
index dace5e9..8e12b20 100644
--- a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingLabelSimTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingLabelSimTest.kt
@@ -108,7 +108,7 @@
on { targetSubInfo }.doReturn(SUB_INFO_1)
on { availableSubInfoList }.doReturn(listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_3))
on { activeSubInfoList }.doReturn(listOf(SUB_INFO_2, SUB_INFO_3))
- on { getSelectableSubscriptionInfo() }.doReturn(
+ on { getSelectableSubscriptionInfoList() }.doReturn(
listOf(
SUB_INFO_1,
SUB_INFO_2,
@@ -139,7 +139,7 @@
on { targetSubInfo }.doReturn(SUB_INFO_1)
on { availableSubInfoList }.doReturn(listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_3))
on { activeSubInfoList }.doReturn(listOf(SUB_INFO_2, SUB_INFO_3))
- on { getSelectableSubscriptionInfo() }.doReturn(
+ on { getSelectableSubscriptionInfoList() }.doReturn(
listOf(
SUB_INFO_1,
SUB_INFO_2,
diff --git a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt
index 35f1968..82dba76 100644
--- a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt
@@ -91,6 +91,7 @@
fun simOnboardingPage_nextAction_fromLabelSimToSelectSim() {
mockSimOnboardingService.stub {
on { isMultipleEnabledProfilesSupported }.thenReturn(true)
+ on { isAllOfSlotAssigned }.thenReturn(true)
}
composeTestRule.setContent {
diff --git a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt
index 5d7465f..45667ef 100644
--- a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt
@@ -108,7 +108,7 @@
on { targetSubInfo }.doReturn(SUB_INFO_1)
on { availableSubInfoList }.doReturn(listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_3))
on { activeSubInfoList }.doReturn(listOf(SUB_INFO_2, SUB_INFO_3))
- on { getSelectableSubscriptionInfo() }.doReturn(
+ on { getSelectableSubscriptionInfoList() }.doReturn(
listOf(
SUB_INFO_1,
SUB_INFO_2,
diff --git a/tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt
new file mode 100644
index 0000000..0483e36
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt
@@ -0,0 +1,240 @@
+/*
+ * 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.widget
+
+import android.content.Context
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.test.assertContentDescriptionEquals
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsNotDisplayed
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithContentDescription
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class CardPreferenceTest {
+
+ @get:Rule val composeTestRule = createComposeRule()
+ private lateinit var context: Context
+
+ @Before
+ fun setUp() {
+ context = ApplicationProvider.getApplicationContext()
+ }
+
+ @Test
+ fun enableDismiss_whenEnable_shouldBeDisplayed() {
+ composeTestRule.setContent { buildCardPreference(enableDismiss = true) }
+
+ composeTestRule.onNodeWithContentDescription("Dismiss").assertIsDisplayed()
+ }
+
+ @Test
+ fun enableDismiss_whenDisable_shouldBeDisplayed() {
+ composeTestRule.setContent { buildCardPreference(enableDismiss = false) }
+
+ composeTestRule.onNodeWithContentDescription("Dismiss").assertIsNotDisplayed()
+ }
+
+ @Test
+ fun primaryButton_whenVisible_shouldBeDisplayed() {
+ val expectedPrimaryButtonText = "You can see me"
+ composeTestRule.setContent {
+ buildCardPreference(
+ primaryButtonText = expectedPrimaryButtonText,
+ primaryButtonVisibility = true,
+ )
+ }
+
+ composeTestRule.onNodeWithText(expectedPrimaryButtonText).assertIsDisplayed()
+ }
+
+ @Test
+ fun primaryButton_whenInvisible_shouldBeDisplayed() {
+ val expectedButtonText = "You cannot see me"
+ composeTestRule.setContent {
+ buildCardPreference(
+ primaryButtonText = expectedButtonText,
+ primaryButtonVisibility = false,
+ )
+ }
+
+ composeTestRule.onNodeWithText(expectedButtonText).assertIsNotDisplayed()
+ }
+
+ @Test
+ fun primaryButtonAction_whenClick_performAction() {
+ val buttonText = "click me"
+ var clicked = false
+ composeTestRule.setContent {
+ buildCardPreference(
+ primaryButtonText = buttonText,
+ primaryButtonVisibility = true,
+ primaryButtonAction = { clicked = true }
+ )
+ }
+
+ composeTestRule.onNodeWithText(buttonText).performClick()
+
+ assertThat(clicked).isTrue()
+ }
+
+ @Test
+ fun primaryButtonContentDescription_whenSet_shouldBeExists() {
+ val expectedText = "this is a content description"
+ val buttonText = "primary-button"
+ composeTestRule.setContent {
+ buildCardPreference(
+ primaryButtonText = buttonText,
+ primaryButtonContentDescription = expectedText,
+ primaryButtonVisibility = true,
+ )
+ }
+
+ composeTestRule.onNodeWithText(buttonText).assertContentDescriptionEquals(expectedText)
+ }
+
+ @Test
+ fun secondaryButton_whenVisible_shouldBeDisplayed() {
+ val expectedSecondaryButtonText = "You can see me"
+ composeTestRule.setContent {
+ buildCardPreference(
+ secondaryButtonText = expectedSecondaryButtonText,
+ secondaryButtonVisibility = true,
+ )
+ }
+
+ composeTestRule.onNodeWithText(expectedSecondaryButtonText).assertIsDisplayed()
+ }
+
+ @Test
+ fun secondaryButton_whenInvisible_shouldBeDisplayed() {
+ val expectedButtonText = "You cannot see me"
+ composeTestRule.setContent {
+ buildCardPreference(
+ secondaryButtonText = expectedButtonText,
+ secondaryButtonVisibility = false,
+ )
+ }
+
+ composeTestRule.onNodeWithText(expectedButtonText).assertIsNotDisplayed()
+ }
+
+ @Test
+ fun secondaryButtonAction_whenClick_performAction() {
+ val buttonText = "click me2"
+ var clicked = false
+ composeTestRule.setContent {
+ buildCardPreference(
+ secondaryButtonText = buttonText,
+ secondaryButtonVisibility = true,
+ secondaryButtonAction = { clicked = true }
+ )
+ }
+
+ composeTestRule.onNodeWithText(buttonText).performClick()
+
+ assertThat(clicked).isTrue()
+ }
+
+ @Test
+ fun secondaryButtonContentDescription_whenSet_shouldBeExists() {
+ val expectedText = "found bug yay"
+ val buttonText = "secondary-button"
+ composeTestRule.setContent {
+ buildCardPreference(
+ secondaryButtonText = buttonText,
+ secondaryButtonContentDescription = expectedText,
+ secondaryButtonVisibility = true,
+ )
+ }
+
+ composeTestRule.onNodeWithText(buttonText).assertContentDescriptionEquals(expectedText)
+ }
+
+ @Test
+ fun resetLayoutState_shouldRemoveThePrimaryButton() {
+ val buttonText = "9527"
+ val cardPreference =
+ CardPreference(context)
+ .apply {
+ primaryButtonText = buttonText
+ primaryButtonVisibility = true
+ }
+ .also { it.buildContent() }
+
+ cardPreference.resetLayoutState()
+ composeTestRule.setContent { cardPreference.Content() }
+
+ composeTestRule.onNodeWithText(buttonText).assertDoesNotExist()
+ }
+
+ @Test
+ fun resetLayoutState_shouldRemoveTheSecondaryButton() {
+ val buttonText = "4567"
+ val cardPreference =
+ CardPreference(context)
+ .apply {
+ secondaryButtonText = buttonText
+ secondaryButtonVisibility = true
+ }
+ .also { it.buildContent() }
+
+ cardPreference.resetLayoutState()
+ composeTestRule.setContent { cardPreference.Content() }
+
+ composeTestRule.onNodeWithText(buttonText).assertDoesNotExist()
+ }
+
+ @Composable
+ private fun buildCardPreference(
+ iconResId: Int? = R.drawable.ic_battery_status_protected_24dp,
+ primaryButtonText: String = "primary text",
+ primaryButtonContentDescription: String? = "primary description",
+ primaryButtonAction: () -> Unit = {},
+ primaryButtonVisibility: Boolean = false,
+ secondaryButtonText: String = "secondary button",
+ secondaryButtonContentDescription: String? = null,
+ secondaryButtonAction: () -> Unit = {},
+ secondaryButtonVisibility: Boolean = false,
+ enableDismiss: Boolean = true,
+ ) =
+ CardPreference(context)
+ .apply {
+ this.iconResId = iconResId
+ this.primaryButtonText = primaryButtonText
+ this.primaryButtonContentDescription = primaryButtonContentDescription
+ this.primaryButtonAction = primaryButtonAction
+ this.primaryButtonVisibility = primaryButtonVisibility
+ this.secondaryButtonText = secondaryButtonText
+ this.secondaryButtonContentDescription = secondaryButtonContentDescription
+ this.secondaryButtonAction = secondaryButtonAction
+ this.secondaryButtonVisibility = secondaryButtonVisibility
+ this.enableDismiss(enableDismiss)
+ }
+ .also { it.buildContent() }
+ .Content()
+}
diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
index acf590b..b5aeac7 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
@@ -17,6 +17,7 @@
package com.android.settings.applications.credentials;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
import static com.google.common.truth.Truth.assertThat;
@@ -55,6 +56,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
@RunWith(AndroidJUnit4.class)
@@ -121,17 +123,34 @@
createControllerWithServices(Lists.newArrayList(createCredentialProviderInfo()));
controller.setSimulateConnectedForTests(true);
assertThat(controller.isConnected()).isTrue();
- controller.setVisibility(true);
- assertThat(controller.getVisibility()).isTrue();
+ controller.setSimulateHiddenForTests(Optional.of(false));
+ assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
+ public void getAvailabilityStatus_isHidden_returnsConditionallyUnavailable() {
+ CredentialManagerPreferenceController controller =
+ createControllerWithServices(Lists.newArrayList(createCredentialProviderInfo()));
+ controller.setSimulateConnectedForTests(true);
+ assertThat(controller.isConnected()).isTrue();
+ controller.setSimulateHiddenForTests(Optional.of(true));
+ assertThat(controller.isHiddenDueToNoProviderSet()).isTrue();
+ assertThat(controller.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
public void displayPreference_withServices_preferencesAdded() {
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(createCredentialProviderInfo()));
+ controller.setSimulateConnectedForTests(true);
+ controller.setSimulateHiddenForTests(Optional.of(false));
+
+ assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
+ assertThat(controller.isConnected()).isTrue();
+ assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+
controller.displayPreference(mScreen);
- assertThat(controller.isConnected()).isFalse();
assertThat(mCredentialsPreferenceCategory.getPreferenceCount()).isEqualTo(1);
Preference pref = mCredentialsPreferenceCategory.getPreference(0);
@@ -150,8 +169,8 @@
createControllerWithServices(Lists.newArrayList(providerInfo1, providerInfo2));
controller.setSimulateConnectedForTests(true);
assertThat(controller.isConnected()).isTrue();
- controller.setVisibility(true);
- assertThat(controller.getVisibility()).isTrue();
+ controller.setSimulateHiddenForTests(Optional.of(false));
+ assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
// Test the data is correct.
@@ -194,8 +213,8 @@
createCredentialProviderInfo("com.android.provider6", "ClassA")));
controller.setSimulateConnectedForTests(true);
assertThat(controller.isConnected()).isTrue();
- controller.setVisibility(true);
- assertThat(controller.getVisibility()).isTrue();
+ controller.setSimulateHiddenForTests(Optional.of(false));
+ assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
// Ensure that we stay under 5 providers.
@@ -263,8 +282,8 @@
createControllerWithServices(Lists.newArrayList(providerInfo1, providerInfo2));
controller.setSimulateConnectedForTests(true);
assertThat(controller.isConnected()).isTrue();
- controller.setVisibility(true);
- assertThat(controller.getVisibility()).isTrue();
+ controller.setSimulateHiddenForTests(Optional.of(false));
+ assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
// Test the data is correct.
@@ -316,9 +335,14 @@
CredentialManagerPreferenceController controller =
createControllerWithServices(
Lists.newArrayList(serviceA1, serviceB1, serviceC1, serviceC2, serviceC3));
- controller.displayPreference(mScreen);
+ controller.setSimulateConnectedForTests(true);
+ controller.setSimulateHiddenForTests(Optional.of(false));
- assertThat(controller.isConnected()).isFalse();
+ assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
+ assertThat(controller.isConnected()).isTrue();
+ assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+
+ controller.displayPreference(mScreen);
assertThat(mCredentialsPreferenceCategory.getPreferenceCount()).isEqualTo(3);
Map<String, CredentialManagerPreferenceController.CombiPreference> prefs =
diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java
new file mode 100644
index 0000000..044c23d
--- /dev/null
+++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.applications.credentials;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CredentialsPickerActivityTest {
+
+ @Mock private UserManager mUserManager;
+
+ private Context mMockContext;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mMockContext = spy(ApplicationProvider.getApplicationContext());
+ when(mMockContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ }
+
+ @Test
+ public void testInjectFragmentIntoIntent_normalProfile() {
+ Intent intent = new Intent();
+ CredentialsPickerActivity.injectFragmentIntoIntent(mMockContext, intent);
+ assertThat(intent.getStringExtra(CredentialsPickerActivity.EXTRA_SHOW_FRAGMENT))
+ .isEqualTo(DefaultCombinedPicker.class.getName());
+ }
+
+ @Test
+ public void testInjectFragmentIntoIntent_workProfile() {
+ Intent intent = new Intent();
+
+ // Simulate managed / work profile.
+ when(mUserManager.isManagedProfile(anyInt())).thenReturn(true);
+ assertThat(DefaultCombinedPickerWork.isUserHandledByFragment(mUserManager, 10)).isTrue();
+
+ CredentialsPickerActivity.injectFragmentIntoIntent(mMockContext, intent);
+ assertThat(intent.getStringExtra(CredentialsPickerActivity.EXTRA_SHOW_FRAGMENT))
+ .isEqualTo(DefaultCombinedPickerWork.class.getName());
+ }
+
+ @Test
+ public void testInjectFragmentIntoIntent_privateProfile() {
+ Intent intent = new Intent();
+
+ // Simulate private profile.
+ UserHandle privateUser = new UserHandle(100);
+ when(mUserManager.getUserInfo(100))
+ .thenReturn(new UserInfo(100, "", "", 0, UserManager.USER_TYPE_PROFILE_PRIVATE));
+ when(mUserManager.getUserProfiles()).thenReturn(Lists.newArrayList(privateUser));
+ assertThat(DefaultCombinedPickerPrivate.isUserHandledByFragment(mUserManager)).isTrue();
+
+ CredentialsPickerActivity.injectFragmentIntoIntent(mMockContext, intent);
+ assertThat(intent.getStringExtra(CredentialsPickerActivity.EXTRA_SHOW_FRAGMENT))
+ .isEqualTo(DefaultCombinedPickerPrivate.class.getName());
+ }
+}
diff --git a/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java
index 301fcfa..d02240e 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java
@@ -87,16 +87,14 @@
@Test
public void ensureSettingsActivityIntentCreatedSuccessfully() {
- DefaultCombinedPreferenceController dcpc =
- new DefaultCombinedPreferenceController(mContext);
-
// Ensure that the settings activity is only created if we haved the right combination
// of package and class name.
- assertThat(dcpc.createSettingsActivityIntent(null, null)).isNull();
- assertThat(dcpc.createSettingsActivityIntent("", null)).isNull();
- assertThat(dcpc.createSettingsActivityIntent("", "")).isNull();
- assertThat(dcpc.createSettingsActivityIntent("com.test", "")).isNull();
- assertThat(dcpc.createSettingsActivityIntent("com.test", "ClassName")).isNotNull();
+ assertThat(CombinedProviderInfo.createSettingsActivityIntent(null, null)).isNull();
+ assertThat(CombinedProviderInfo.createSettingsActivityIntent("", null)).isNull();
+ assertThat(CombinedProviderInfo.createSettingsActivityIntent("", "")).isNull();
+ assertThat(CombinedProviderInfo.createSettingsActivityIntent("com.test", "")).isNull();
+ assertThat(CombinedProviderInfo.createSettingsActivityIntent("com.test", "ClassName"))
+ .isNotNull();
}
@Test
@@ -112,13 +110,13 @@
// Update the preference to use the provider and make sure the view
// was updated.
- dcpc.updatePreferenceForProvider(ppp, "App Name", "Subtitle", appIcon, null);
+ dcpc.updatePreferenceForProvider(ppp, "App Name", "Subtitle", appIcon, null, null);
assertThat(ppp.getTitle().toString()).isEqualTo("App Name");
assertThat(ppp.getSummary().toString()).isEqualTo("Subtitle");
assertThat(ppp.getIcon()).isEqualTo(appIcon);
// Set the preference back to none and make sure the view was updated.
- dcpc.updatePreferenceForProvider(ppp, null, null, null, null);
+ dcpc.updatePreferenceForProvider(ppp, null, null, null, null, null);
assertThat(ppp.getTitle().toString()).isEqualTo("None");
assertThat(ppp.getSummary()).isNull();
assertThat(ppp.getIcon()).isNull();
diff --git a/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java b/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java
index 0738a3c..4d21364 100644
--- a/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java
@@ -19,9 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
import android.content.Context;
import android.widget.Button;
@@ -61,20 +59,10 @@
}
@Test
- public void testOnClick_inFullScreen() {
- when(mListener.onShowSplitScreenDialog()).thenReturn(false);
+ public void testOnClick() {
mController.onClick(mButton);
assertThat(mController.isClicked()).isTrue();
verify(mListener).onStartEnrolling(any());
}
-
- @Test
- public void testOnClick_inMultiWindow() {
- when(mListener.onShowSplitScreenDialog()).thenReturn(true);
- mController.onClick(mButton);
-
- assertThat(mController.isClicked()).isFalse();
- verify(mListener, never()).onStartEnrolling(any());
- }
}
diff --git a/tests/unit/src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImplTest.kt b/tests/unit/src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImplTest.kt
new file mode 100644
index 0000000..794cfec
--- /dev/null
+++ b/tests/unit/src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImplTest.kt
@@ -0,0 +1,201 @@
+/*
+ * 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.biometrics.fingerprint.feature
+
+import android.animation.Animator
+import android.content.Context
+import android.hardware.fingerprint.FingerprintManager
+import android.view.View
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_CENTER
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_FINGERTIP
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_LEFT_EDGE
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_NO_ANIMATION
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_RIGHT_EDGE
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.STAGE_UNKNOWN
+import com.google.common.truth.Truth.assertThat
+import kotlin.math.roundToInt
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.doReturn
+import org.mockito.Mockito.mock
+import org.mockito.Spy
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+import org.mockito.Mockito.`when` as whenever
+
+@RunWith(AndroidJUnit4::class)
+class SfpsEnrollmentFeatureImplTest {
+ @get:Rule
+ val mockito: MockitoRule = MockitoJUnit.rule()
+
+ @Spy
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val settingsPackageName = "com.android.settings"
+
+ private lateinit var settingsContext: Context
+
+ @Mock
+ private lateinit var mockFingerprintManager: FingerprintManager
+
+ private val mSfpsEnrollmentFeatureImpl: SfpsEnrollmentFeatureImpl = SfpsEnrollmentFeatureImpl()
+
+ @Before
+ fun setUp() {
+ assertThat(mSfpsEnrollmentFeatureImpl).isInstanceOf(SfpsEnrollmentFeatureImpl::class.java)
+ whenever(context.getSystemService(FingerprintManager::class.java))
+ .thenReturn(mockFingerprintManager)
+ doReturn(0f).`when`(mockFingerprintManager).getEnrollStageThreshold(0)
+ doReturn(0.36f).`when`(mockFingerprintManager).getEnrollStageThreshold(1)
+ doReturn(0.52f).`when`(mockFingerprintManager).getEnrollStageThreshold(2)
+ doReturn(0.76f).`when`(mockFingerprintManager).getEnrollStageThreshold(3)
+ doReturn(1f).`when`(mockFingerprintManager).getEnrollStageThreshold(4)
+ settingsContext = context.createPackageContext(settingsPackageName, 0)
+ }
+
+ @Test
+ fun testGetEnrollStageThreshold() {
+ assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 0)).isEqualTo(0f)
+ assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 1)).isEqualTo(0.36f)
+ assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 2)).isEqualTo(0.52f)
+ assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 3)).isEqualTo(0.76f)
+ assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 4)).isEqualTo(1f)
+ }
+
+ @Test
+ fun testGetHelpAnimator() {
+ val mockView: View = mock(View::class.java)
+ val animator: Animator = mSfpsEnrollmentFeatureImpl.getHelpAnimator(mockView)
+ assertThat(animator.duration).isEqualTo(550)
+ }
+
+ @Test
+ fun testGetCurrentSfpsEnrollStage() {
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(0, null))
+ .isEqualTo(STAGE_UNKNOWN)
+ val mapper = { i: Int ->
+ (25 * mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, i)).roundToInt()
+ }
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(-1, mapper))
+ .isEqualTo(SFPS_STAGE_NO_ANIMATION)
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(0, mapper))
+ .isEqualTo(SFPS_STAGE_CENTER)
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(9, mapper))
+ .isEqualTo(SFPS_STAGE_FINGERTIP)
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(13, mapper))
+ .isEqualTo(SFPS_STAGE_LEFT_EDGE)
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(19, mapper))
+ .isEqualTo(SFPS_STAGE_RIGHT_EDGE)
+ assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(25, mapper))
+ .isEqualTo(SFPS_STAGE_RIGHT_EDGE)
+ }
+
+ @Test
+ fun testGetFeaturedStageHeaderResource() {
+ val type = "string"
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_NO_ANIMATION)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "security_settings_fingerprint_enroll_repeat_title",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_CENTER)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "security_settings_sfps_enroll_finger_center_title",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_FINGERTIP)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "security_settings_sfps_enroll_fingertip_title",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_LEFT_EDGE)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "security_settings_sfps_enroll_left_edge_title",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_RIGHT_EDGE)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "security_settings_sfps_enroll_right_edge_title",
+ type,
+ settingsPackageName)
+ )
+ }
+
+ @Test
+ fun testGetSfpsEnrollLottiePerStage() {
+ val type = "raw"
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_NO_ANIMATION)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "sfps_lottie_no_animation",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_CENTER)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "sfps_lottie_pad_center",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_FINGERTIP)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "sfps_lottie_tip",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_LEFT_EDGE)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "sfps_lottie_left_edge",
+ type,
+ settingsPackageName)
+ )
+ assertThat(
+ mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_RIGHT_EDGE)
+ ).isEqualTo(
+ settingsContext.resources.getIdentifier(
+ "sfps_lottie_right_edge",
+ type,
+ settingsPackageName)
+ )
+ }
+}
\ No newline at end of file
diff --git a/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java
index 5f02b04..9a5399c 100644
--- a/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java
@@ -37,7 +37,6 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.ResourcesUtils;
import org.junit.Before;
@@ -89,27 +88,10 @@
mCategory.setKey(categoryKey);
mScreen.addPreference(mCategory);
- doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt());
doReturn(mSecondPreference).when(mController).createNewPreference(mContext);
}
@Test
- public void getAvailabilityStatus_isVoiceCapable_shouldBeAVAILABLE() {
- when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_isNotVoiceCapable_shouldBeUNSUPPORTED_ON_DEVICE() {
- when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
public void displayPreference_multiSim_shouldAddSecondPreference() {
when(mTelephonyManager.getPhoneCount()).thenReturn(2);
@@ -123,6 +105,7 @@
@Test
public void updateState_singleSim_shouldUpdateTitleAndPhoneNumber() {
final String phoneNumber = "1111111111";
+ doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt());
doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo);
when(mTelephonyManager.getPhoneCount()).thenReturn(1);
mController.displayPreference(mScreen);
@@ -136,6 +119,7 @@
@Test
public void updateState_multiSim_shouldUpdateTitleAndPhoneNumberOfMultiplePreferences() {
final String phoneNumber = "1111111111";
+ doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt());
doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo);
when(mTelephonyManager.getPhoneCount()).thenReturn(2);
mController.displayPreference(mScreen);
@@ -153,11 +137,11 @@
@Test
public void getSummary_cannotGetActiveSubscriptionInfo_shouldShowUnknown() {
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
+ mController.displayPreference(mScreen);
- CharSequence primaryNumber = mController.getSummary();
+ mController.updateState(mPreference);
- assertThat(primaryNumber).isNotNull();
- assertThat(primaryNumber).isEqualTo(ResourcesUtils.getResourcesString(
+ verify(mPreference).setSummary(ResourcesUtils.getResourcesString(
mContext, "device_info_default"));
}
@@ -166,9 +150,10 @@
List<SubscriptionInfo> infos = new ArrayList<>();
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(infos);
- CharSequence primaryNumber = mController.getSummary();
+ mController.displayPreference(mScreen);
+ mController.updateState(mPreference);
- assertThat(primaryNumber).isEqualTo(ResourcesUtils.getResourcesString(
+ verify(mPreference).setSummary(ResourcesUtils.getResourcesString(
mContext, "device_info_default"));
}
}
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java
index c04e5f9..d1e3078 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressFeminineControllerTest.java
@@ -97,7 +97,6 @@
selectedPreference.performClick();
- assertThat(selectedPreference.getKey()).isEqualTo(KEY_FEMININE);
assertThat(selectedPreference.isSelected()).isTrue();
assertThat(pref.isSelected()).isFalse();
}
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java
index c2298be..5bf3073 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressMasculineControllerTest.java
@@ -97,7 +97,6 @@
selectedPreference.performClick();
- assertThat(selectedPreference.getKey()).isEqualTo(KEY_MASCULINE);
assertThat(selectedPreference.isSelected()).isTrue();
assertThat(pref.isSelected()).isFalse();
}
diff --git a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java
index fb207fc..e83f3cd 100644
--- a/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/TermsOfAddressNeutralControllerTest.java
@@ -97,7 +97,6 @@
selectedPreference.performClick();
- assertThat(selectedPreference.getKey()).isEqualTo(KEY_NEUTRAL);
assertThat(selectedPreference.isSelected()).isTrue();
assertThat(pref.isSelected()).isFalse();
}
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
index 4d48025..11a490e 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
@@ -98,6 +98,7 @@
doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mSubscriptionManager.createForAllUserProfiles()).thenReturn(mSubscriptionManager);
doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
@@ -182,7 +183,8 @@
mController.onPreferenceChange(mPreference, true);
- verify(mTelephonyManager).setDataEnabled(true);
+ verify(mTelephonyManager).setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER
+ ,true);
}
@Test
@@ -195,7 +197,8 @@
mController.onPreferenceChange(mPreference, true);
- verify(mTelephonyManager).setDataEnabled(true);
+ verify(mTelephonyManager).setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER
+ ,true);
}
@Test
diff --git a/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java
deleted file mode 100644
index 8fb3eae..0000000
--- a/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2023 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.privatespace;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
-import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.preference.Preference;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class DeletePrivateSpaceControllerTest {
- @Mock private PrivateSpaceMaintainer mPrivateSpaceMaintainer;
- @Mock private Context mContext;
-
- private Preference mPreference;
- private DeletePrivateSpaceController mDeletePrivateSpaceController;
-
- /** Required setup before a test. */
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = ApplicationProvider.getApplicationContext();
- final String preferenceKey = "private_space_delete";
-
- mPreference = new Preference(ApplicationProvider.getApplicationContext());
- mPreference.setKey(preferenceKey);
-
- mDeletePrivateSpaceController =
- new DeletePrivateSpaceController(
- mContext,
- preferenceKey,
- new DeletePrivateSpaceController.Injector() {
- @Override
- PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
- return mPrivateSpaceMaintainer;
- }
- });
- }
-
- /** Tests that the controller is always available. */
- @Test
- public void getAvailabilityStatus_returnsAvailable() {
- assertThat(mDeletePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- /** Tests that on click it attempts to delete the PS. */
- @Test
- public void handlePreferenceTreeClick_attemptsToDeletePrivateSpace() {
- doReturn(DELETE_PS_ERROR_NONE).when(mPrivateSpaceMaintainer).deletePrivateSpace();
- DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
- doNothing().when(spy).showSuccessfulDeletionToast();
- spy.handlePreferenceTreeClick(mPreference);
-
- verify(mPrivateSpaceMaintainer).deletePrivateSpace();
- }
-
- /** Tests that on deletion of PS relevant toast is shown. */
- @Test
- public void handlePreferenceTreeClick_onDeletion_showsDeletedToast() {
- doReturn(DELETE_PS_ERROR_NONE).when(mPrivateSpaceMaintainer).deletePrivateSpace();
- DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
- doNothing().when(spy).showSuccessfulDeletionToast();
- spy.handlePreferenceTreeClick(mPreference);
-
- verify(spy).showSuccessfulDeletionToast();
- }
-
- /** Tests that on failing to delete the PS relevant toast is shown. */
- @Test
- public void handlePreferenceTreeClick_onDeletionError_showsDeletionFailedToast() {
- doReturn(DELETE_PS_ERROR_INTERNAL).when(mPrivateSpaceMaintainer).deletePrivateSpace();
- DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
- doNothing().when(spy).showDeletionInternalErrorToast();
- spy.handlePreferenceTreeClick(mPreference);
-
- verify(spy).showDeletionInternalErrorToast();
- }
-}
diff --git a/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java
new file mode 100644
index 0000000..371ca24
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.privatespace.delete;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DeletePrivateSpaceControllerTest {
+ @Mock private Context mContext;
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private Preference mPreference;
+ private DeletePrivateSpaceController mDeletePrivateSpaceController;
+
+ /** Required setup before a test. */
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = ApplicationProvider.getApplicationContext();
+ final String preferenceKey = "private_space_delete";
+
+ mPreference = new Preference(ApplicationProvider.getApplicationContext());
+ mPreference.setKey(preferenceKey);
+
+ mDeletePrivateSpaceController = new DeletePrivateSpaceController(mContext, preferenceKey);
+ }
+
+ /** Tests that the controller is available when private space flag is enabled. */
+ @Test
+ public void getAvailabilityStatus_whenPrivateFlagEnabled_returnsAvailable() {
+ mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+
+ assertThat(mDeletePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ /** Tests that the controller is not available when private space flag is disabled. */
+ @Test
+ public void getAvailabilityStatus_whenPrivateFlagDisabled_returnsUnsupportedOnDevice() {
+ mSetFlagsRule.disableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+
+ assertThat(mDeletePrivateSpaceController.getAvailabilityStatus())
+ .isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java
new file mode 100644
index 0000000..16ccbc4
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.privatespace.delete;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+
+import android.app.settings.SettingsEnums;
+import android.os.Flags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class PrivateSpaceDeleteFragmentTest {
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private PrivateSpaceDeleteFragment mFragment;
+
+ @Test
+ @UiThreadTest
+ public void verifyMetricsConstant() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mFragment = spy(new PrivateSpaceDeleteFragment());
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(SettingsEnums.PRIVATE_SPACE_SETTINGS);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java
new file mode 100644
index 0000000..5c2ef23
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.privatespace.delete;
+
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Flags;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.privatespace.PrivateSpaceMaintainer;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class PrivateSpaceDeletionProgressFragmentTest {
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private Context mContext;
+ private PrivateSpaceDeletionProgressFragment mFragment;
+ private PrivateSpaceMaintainer mPrivateSpaceMaintainer;
+ @Mock private PrivateSpaceMaintainer mPrivateSpaceMaintainerMock;
+
+ @UiThreadTest
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = ApplicationProvider.getApplicationContext();
+ mFragment = new PrivateSpaceDeletionProgressFragment();
+ PrivateSpaceDeletionProgressFragment.Injector injector =
+ new PrivateSpaceDeletionProgressFragment.Injector() {
+ @Override
+ public PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+ return mPrivateSpaceMaintainer;
+ }
+ };
+ mPrivateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext);
+ mFragment.setPrivateSpaceMaintainer(injector);
+ }
+
+ @After
+ public void tearDown() {
+ mPrivateSpaceMaintainer.deletePrivateSpace();
+ }
+
+ @Test
+ @UiThreadTest
+ public void verifyMetricsConstant() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(SettingsEnums.PRIVATE_SPACE_SETTINGS);
+ }
+
+ /** Tests that deletePrivateSpace() deletes the private space. */
+ @Test
+ @UiThreadTest
+ public void deletePrivateSpace_deletesPS() {
+ PrivateSpaceDeletionProgressFragment spyFragment = spy(mFragment);
+ doNothing().when(spyFragment).showSuccessfulDeletionToast();
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+
+ mPrivateSpaceMaintainer.createPrivateSpace();
+ spyFragment.deletePrivateSpace();
+ assertThat(mPrivateSpaceMaintainer.doesPrivateSpaceExist()).isFalse();
+ }
+
+ /** Tests that on deletion of the private space relevant toast is shown. */
+ @Test
+ @UiThreadTest
+ public void deletePrivateSpace_onDeletion_showsDeletedToast() {
+ PrivateSpaceDeletionProgressFragment spyFragment = spy(mFragment);
+ doNothing().when(spyFragment).showSuccessfulDeletionToast();
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+
+ mPrivateSpaceMaintainer.createPrivateSpace();
+ spyFragment.deletePrivateSpace();
+ verify(spyFragment).showSuccessfulDeletionToast();
+ }
+
+ /** Tests that on failing to delete the private space relevant toast is shown. */
+ @Test
+ @UiThreadTest
+ public void deletePrivateSpace_onDeletionError_showsDeletionFailedToast() {
+ PrivateSpaceDeletionProgressFragment spyFragment =
+ spy(new PrivateSpaceDeletionProgressFragment());
+ PrivateSpaceDeletionProgressFragment.Injector injector =
+ new PrivateSpaceDeletionProgressFragment.Injector() {
+ @Override
+ PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+ return mPrivateSpaceMaintainerMock;
+ }
+ };
+ spyFragment.setPrivateSpaceMaintainer(injector);
+ doReturn(DELETE_PS_ERROR_INTERNAL).when(mPrivateSpaceMaintainerMock).deletePrivateSpace();
+ doNothing().when(spyFragment).showDeletionInternalErrorToast();
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+
+ spyFragment.deletePrivateSpace();
+
+ verify(spyFragment).showDeletionInternalErrorToast();
+ }
+}
diff --git a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
index f6356bc..71d419e 100644
--- a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
@@ -114,7 +114,7 @@
@Test
public void setSafetySourceData_whenSafetyCenterIsEnabled_withoutBiometrics_setsNullData() {
- when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
when(mFaceManager.isHardwareDetected()).thenReturn(false);
diff --git a/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
index 3538727..e528c4e 100644
--- a/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
@@ -413,6 +413,8 @@
when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
when(mScreenLockPreferenceDetailsUtils.isPasswordQualityManaged(anyInt(), any()))
.thenReturn(false);
+ when(mScreenLockPreferenceDetailsUtils.isLockPatternSecure()).thenReturn(true);
+ when(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).thenReturn(true);
LockScreenSafetySource.setSafetySourceData(
mApplicationContext, mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
diff --git a/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java b/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
index 9851a1a..31f7878 100644
--- a/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
+++ b/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
@@ -107,7 +107,7 @@
@Test
public void whenSafetyCenterIsEnabled_pageIndexExcluded() throws Exception {
- when(mSafetyCenterManagerWrapper.isEnabled(any())).thenReturn(false);
+ when(mSafetyCenterManagerWrapper.isEnabled(any())).thenReturn(true);
BaseSearchIndexProvider indexProvider = SecurityAdvancedSettings.SEARCH_INDEX_DATA_PROVIDER;
List<String> allXmlKeys = TestUtils.getAllXmlKeys(mContext, indexProvider);