Merge "Update usage of IMountService constants."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 44d4c19..097f207 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2031,10 +2031,8 @@
         <!-- Bluetooth stuff -->
 
         <activity android:name=".bluetooth.BluetoothPairingDialog"
-                  android:label="@string/bluetooth_pairing_request"
                   android:excludeFromRecents="true"
-                  android:windowSoftInputMode="stateVisible|adjustResize"
-                  android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
+                  android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar">
             <intent-filter android:priority="1">
                 <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -3071,6 +3069,18 @@
                        android:value="com.android.settings.datausage.DataUsageSummary"/>
         </activity-alias>
 
+        <activity android:name=".Settings$AppAndNotificationDashboardActivity"
+                  android:label="@string/app_and_notification_dashboard_title"
+                  android:icon="@drawable/ic_settings_applications">
+            <intent-filter android:priority="8">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.applications.AppAndNotificationDashboardFragment"/>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.homepage"/>
+        </activity>
+
         <activity-alias android:name="BatteryDashboardAlias"
                         android:targetActivity="Settings$PowerUsageSummaryActivity">
             <intent-filter android:priority="7">
@@ -3095,10 +3105,23 @@
                        android:value="true" />
         </activity-alias>
 
+        <activity-alias android:name="SoundDashboardAlias"
+                        android:targetActivity="Settings$SoundSettingsActivity">
+            <intent-filter android:priority="5">
+                <action android:name="com.android.settings.action.SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.homepage" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.notification.SoundSettings" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true" />
+        </activity-alias>
+
         <activity android:name=".Settings$StorageDashboardActivity"
                   android:label="@string/storage_settings"
                   android:icon="@drawable/ic_settings_storage">
-            <intent-filter android:priority="5">
+            <intent-filter android:priority="4">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
@@ -3136,6 +3159,19 @@
                        android:value="true" />
         </activity-alias>
 
+        <activity-alias android:name="LocationDashboardAlias"
+                        android:targetActivity="Settings$LocationSettingsActivity">
+            <intent-filter>
+                <action android:name="com.android.settings.action.SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.security" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.location.LocationSettings" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true" />
+        </activity-alias>
+
         <activity android:name=".Settings$SystemDashboardActivity"
                   android:label="@string/header_category_system"
                   android:icon="@drawable/ic_settings_about">
@@ -3203,6 +3239,20 @@
                        android:value="true" />
         </activity-alias>
 
+        <activity-alias android:name="GestureDashboardAlias"
+                        android:targetActivity="Settings$GestureSettingsActivity"
+                        android:enabled="@bool/config_gesture_settings_enabled">
+            <intent-filter android:priority="70">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.system"/>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.gestures.GestureSettings"/>
+            <meta-data android:name="com.android.settings.summary"
+                       android:resource="@string/gesture_preference_summary"/>
+        </activity-alias>
+
         <activity-alias android:name="BackupResetDashboardAlias"
                         android:targetActivity="Settings$PrivacySettingsActivity">
             <intent-filter android:priority="60">
@@ -3290,6 +3340,94 @@
                        android:value="com.android.settings.category.ia.device" />
         </activity-alias>
 
+        <activity-alias android:name="ManageApplicationsDashboardAlias"
+                        android:targetActivity="Settings$ManageApplicationsActivity">
+            <intent-filter android:priority="200">
+                <action android:name="com.android.settings.action.SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.apps" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.applications.ManageApplications" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true" />
+        </activity-alias>
+
+        <activity-alias android:name="AppNotificationDashboardAlias"
+                        android:targetActivity="Settings$NotificationAppListActivity">
+            <intent-filter android:priority="150">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.apps"/>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.applications.NotificationApps"/>
+        </activity-alias>
+
+        <activity-alias android:name="ConfigureNotificationDashboardAlias"
+                  android:targetActivity="Settings$ConfigureNotificationSettingsActivity">
+            <intent-filter android:priority="120">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.apps"/>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.notification.ConfigureNotificationSettings" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true" />
+        </activity-alias>
+
+        <activity android:name=".Settings$UserAndAccountDashboardActivity"
+                  android:label="@string/account_dashboard_title"
+                  android:icon="@drawable/ic_settings_accounts">
+            <intent-filter android:priority="2">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.accounts.UserAndAccountDashboardFragment"/>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.homepage"/>
+        </activity>
+
+        <activity-alias android:name="UserDashboardAlias"
+                        android:targetActivity="Settings$UserSettingsActivity">
+            <intent-filter android:priority="8">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.users.UserSettings" />
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.accounts" />
+        </activity-alias>
+
+        <activity-alias android:name="AppDefaultDashboardAlias"
+                        android:targetActivity="Settings$AdvancedAppsActivity"
+                        android:label="@string/app_default_dashboard_title"
+                        android:icon="@drawable/ic_settings_applications">
+            <intent-filter android:priority="130">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.apps"/>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.applications.AdvancedAppSettings" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true" />
+        </activity-alias>
+
+        <activity-alias android:name="PaymentSettingsDashboardAlias"
+                        android:targetActivity="Settings$PaymentSettingsActivity">
+            <intent-filter android:priority="10">
+                <action android:name="com.android.settings.action.SETTINGS"/>
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.ia.apps.default"/>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.nfc.PaymentSettings"/>
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true"/>
+        </activity-alias>
+
         <!-- End of information architecture host activities -->
 
         <service
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
new file mode 100644
index 0000000..653380c
--- /dev/null
+++ b/PREUPLOAD.cfg
@@ -0,0 +1,4 @@
+[Hook Scripts]
+checkstyle_hook = ../../../development/tools/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
+                  -fw src/com/android/settings/print/
+
diff --git a/res/color/white_disabled.xml b/res/color/white_disabled.xml
new file mode 100644
index 0000000..17008a8
--- /dev/null
+++ b/res/color/white_disabled.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/white"
+        android:alpha="?android:attr/disabledAlpha" />
+</selector>
diff --git a/res/drawable/enrollment_fingerprint_isolated.xml b/res/drawable/enrollment_fingerprint_isolated.xml
index fc31ff8..de3965e 100644
--- a/res/drawable/enrollment_fingerprint_isolated.xml
+++ b/res/drawable/enrollment_fingerprint_isolated.xml
@@ -17,14 +17,14 @@
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:name="enrollment_fingerprint_isolated"
-    android:width="75dp"
-    android:viewportWidth="75"
+    android:width="88dp"
     android:height="88dp"
-    android:viewportHeight="88" >
+    android:viewportWidth="176"
+    android:viewportHeight="176" >
     <group
         android:name="fingerprint_ridges_2"
-        android:translateX="37.5835"
-        android:translateY="43.66685" >
+        android:translateX="88"
+        android:translateY="87.66685" >
         <group
             android:name="ridge_5" >
             <path
diff --git a/res/drawable/fingerprint_progress_ring.xml b/res/drawable/fingerprint_progress_ring.xml
deleted file mode 100644
index 44a69e9..0000000
--- a/res/drawable/fingerprint_progress_ring.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@android:id/background">
-        <shape
-            android:innerRadius="?attr/fingerprint_ring_radius"
-            android:shape="ring"
-            android:thickness="@dimen/fingerprint_ring_thickness"
-            android:useLevel="false">
-            <solid android:color="@color/fingerprint_progress_ring_bg" />
-        </shape>
-    </item>
-    <item android:id="@android:id/progress">
-        <shape
-            android:innerRadius="?attr/fingerprint_ring_radius"
-            android:shape="ring"
-            android:thickness="@dimen/fingerprint_ring_thickness">
-            <gradient
-                android:startColor="@color/fingerprint_progress_ring"
-                android:endColor="@color/fingerprint_progress_ring"
-                android:angle="0"
-            />
-        </shape>
-    </item>
-</layer-list>
diff --git a/res/drawable/fp_illustration.xml b/res/drawable/fp_illustration.xml
new file mode 100644
index 0000000..17ab4d2
--- /dev/null
+++ b/res/drawable/fp_illustration.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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
+  -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/fingerprint_background"
+        android:drawable="@drawable/fp_illustration_enrollment" />
+
+    <item
+        android:id="@+id/fingerprint_animation"
+        android:drawable="@drawable/enrollment_fingerprint_isolated_animation" />
+
+</layer-list>
diff --git a/res/drawable/fp_illustration_enrollment.xml b/res/drawable/fp_illustration_enrollment.xml
index f9b7ed4..630c6bd 100644
--- a/res/drawable/fp_illustration_enrollment.xml
+++ b/res/drawable/fp_illustration_enrollment.xml
@@ -16,21 +16,25 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="88.0dp"
         android:height="88.0dp"
-        android:viewportWidth="88.0"
-        android:viewportHeight="88.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M67.74,11.59c-0.41,0.0 -0.82,-0.1 -1.2,-0.31c-7.44,-4.06 -15.0,-6.04 -23.11,-6.04c-7.92,0.0 -14.67,1.85 -21.88,6.01c-1.2,0.69 -2.73,0.28 -3.42,-0.92s-0.28,-2.72 0.92,-3.41c7.9,-4.55 15.65,-6.68 24.37,-6.68c8.97,0.0 17.32,2.17 25.51,6.65c1.21,0.66 1.66,2.18 1.0,3.39C69.48,11.12 68.62,11.59 67.74,11.59z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M9.25,34.74c-0.48,0.0 -0.96,-0.14 -1.39,-0.42c-1.15,-0.77 -1.45,-2.32 -0.68,-3.47c4.09,-6.09 9.3,-10.89 15.49,-14.27c6.52,-3.55 13.91,-5.43 21.38,-5.43c7.44,0.0 14.8,1.86 21.3,5.39c6.17,3.35 11.38,8.12 15.47,14.16c0.77,1.14 0.47,2.7 -0.67,3.47c-1.14,0.77 -2.7,0.47 -3.47,-0.67c-3.64,-5.38 -8.25,-9.61 -13.71,-12.57c-5.77,-3.13 -12.31,-4.78 -18.92,-4.78c-6.63,0.0 -13.2,1.67 -18.98,4.82c-5.48,2.99 -10.1,7.25 -13.73,12.66C10.85,34.35 10.06,34.74 9.25,34.74z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M34.76,86.82c-0.67,0.0 -1.33,-0.27 -1.82,-0.79c-3.49,-3.72 -5.51,-6.25 -8.26,-11.45c-2.84,-5.35 -4.34,-11.88 -4.34,-18.86c0.0,-13.02 10.59,-23.61 23.61,-23.61c13.02,0.0 23.61,10.59 23.61,23.61c0.0,1.38 -1.12,2.5 -2.5,2.5s-2.5,-1.12 -2.5,-2.5c0.0,-10.26 -8.35,-18.61 -18.61,-18.61c-10.26,0.0 -18.61,8.35 -18.61,18.61c0.0,6.17 1.3,11.89 3.76,16.52c2.62,4.94 4.37,7.04 7.49,10.37c0.94,1.01 0.89,2.59 -0.11,3.53C35.99,86.6 35.38,86.82 34.76,86.82z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M64.28,78.84c-4.99,0.0 -9.35,-1.32 -12.98,-3.92c-6.17,-4.43 -9.86,-11.6 -9.86,-19.19c0.0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5c0.0,5.98 2.91,11.64 7.77,15.13c2.8,2.01 6.09,2.98 10.06,2.98c0.97,0.0 2.57,-0.11 4.17,-0.4c1.36,-0.25 2.66,0.64 2.92,2.0c0.25,1.36 -0.64,2.66 -2.0,2.92C66.93,78.8 64.86,78.84 64.28,78.84z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M55.92,87.75c-0.23,0.0 -0.46,-0.03 -0.7,-0.1c-6.6,-1.91 -10.92,-4.49 -15.4,-9.2c-5.76,-6.06 -8.94,-14.13 -8.94,-22.72c0.0,-7.2 5.86,-13.05 13.05,-13.05c7.2,0.0 13.05,5.86 13.05,13.05c0.0,4.44 3.61,8.05 8.05,8.05s8.05,-3.61 8.05,-8.05c0.0,-16.08 -13.08,-29.16 -29.16,-29.16c-11.43,0.0 -21.86,6.73 -26.58,17.15c-1.57,3.48 -2.37,7.52 -2.37,12.01c0.0,3.36 0.28,8.62 2.71,15.49c0.46,1.3 -0.22,2.73 -1.52,3.19c-1.3,0.46 -2.73,-0.22 -3.19,-1.52c-2.02,-5.7 -3.0,-11.31 -3.0,-17.16c0.0,-5.21 0.95,-9.94 2.82,-14.07c5.52,-12.2 17.74,-20.09 31.13,-20.09c18.83,0.0 34.16,15.32 34.16,34.16c0.0,7.2 -5.86,13.05 -13.05,13.05S52.0,62.92 52.0,55.73c0.0,-4.44 -3.61,-8.05 -8.05,-8.05s-8.05,3.61 -8.05,8.05c0.0,7.3 2.69,14.15 7.56,19.28c3.86,4.06 7.43,6.18 13.17,7.84c1.33,0.38 2.09,1.77 1.71,3.1C58.01,87.04 57.01,87.75 55.92,87.75z"/>
+        android:viewportWidth="176.0"
+        android:viewportHeight="176.0">
+    <group
+        android:translateX="44"
+        android:translateY="44">
+        <path
+            android:fillColor="#FF000000"
+            android:pathData="M67.74,11.59c-0.41,0.0 -0.82,-0.1 -1.2,-0.31c-7.44,-4.06 -15.0,-6.04 -23.11,-6.04c-7.92,0.0 -14.67,1.85 -21.88,6.01c-1.2,0.69 -2.73,0.28 -3.42,-0.92s-0.28,-2.72 0.92,-3.41c7.9,-4.55 15.65,-6.68 24.37,-6.68c8.97,0.0 17.32,2.17 25.51,6.65c1.21,0.66 1.66,2.18 1.0,3.39C69.48,11.12 68.62,11.59 67.74,11.59z"/>
+        <path
+            android:fillColor="#FF000000"
+            android:pathData="M9.25,34.74c-0.48,0.0 -0.96,-0.14 -1.39,-0.42c-1.15,-0.77 -1.45,-2.32 -0.68,-3.47c4.09,-6.09 9.3,-10.89 15.49,-14.27c6.52,-3.55 13.91,-5.43 21.38,-5.43c7.44,0.0 14.8,1.86 21.3,5.39c6.17,3.35 11.38,8.12 15.47,14.16c0.77,1.14 0.47,2.7 -0.67,3.47c-1.14,0.77 -2.7,0.47 -3.47,-0.67c-3.64,-5.38 -8.25,-9.61 -13.71,-12.57c-5.77,-3.13 -12.31,-4.78 -18.92,-4.78c-6.63,0.0 -13.2,1.67 -18.98,4.82c-5.48,2.99 -10.1,7.25 -13.73,12.66C10.85,34.35 10.06,34.74 9.25,34.74z"/>
+        <path
+            android:fillColor="#FF000000"
+            android:pathData="M34.76,86.82c-0.67,0.0 -1.33,-0.27 -1.82,-0.79c-3.49,-3.72 -5.51,-6.25 -8.26,-11.45c-2.84,-5.35 -4.34,-11.88 -4.34,-18.86c0.0,-13.02 10.59,-23.61 23.61,-23.61c13.02,0.0 23.61,10.59 23.61,23.61c0.0,1.38 -1.12,2.5 -2.5,2.5s-2.5,-1.12 -2.5,-2.5c0.0,-10.26 -8.35,-18.61 -18.61,-18.61c-10.26,0.0 -18.61,8.35 -18.61,18.61c0.0,6.17 1.3,11.89 3.76,16.52c2.62,4.94 4.37,7.04 7.49,10.37c0.94,1.01 0.89,2.59 -0.11,3.53C35.99,86.6 35.38,86.82 34.76,86.82z"/>
+        <path
+            android:fillColor="#FF000000"
+            android:pathData="M64.28,78.84c-4.99,0.0 -9.35,-1.32 -12.98,-3.92c-6.17,-4.43 -9.86,-11.6 -9.86,-19.19c0.0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5c0.0,5.98 2.91,11.64 7.77,15.13c2.8,2.01 6.09,2.98 10.06,2.98c0.97,0.0 2.57,-0.11 4.17,-0.4c1.36,-0.25 2.66,0.64 2.92,2.0c0.25,1.36 -0.64,2.66 -2.0,2.92C66.93,78.8 64.86,78.84 64.28,78.84z"/>
+        <path
+            android:fillColor="#FF000000"
+            android:pathData="M55.92,87.75c-0.23,0.0 -0.46,-0.03 -0.7,-0.1c-6.6,-1.91 -10.92,-4.49 -15.4,-9.2c-5.76,-6.06 -8.94,-14.13 -8.94,-22.72c0.0,-7.2 5.86,-13.05 13.05,-13.05c7.2,0.0 13.05,5.86 13.05,13.05c0.0,4.44 3.61,8.05 8.05,8.05s8.05,-3.61 8.05,-8.05c0.0,-16.08 -13.08,-29.16 -29.16,-29.16c-11.43,0.0 -21.86,6.73 -26.58,17.15c-1.57,3.48 -2.37,7.52 -2.37,12.01c0.0,3.36 0.28,8.62 2.71,15.49c0.46,1.3 -0.22,2.73 -1.52,3.19c-1.3,0.46 -2.73,-0.22 -3.19,-1.52c-2.02,-5.7 -3.0,-11.31 -3.0,-17.16c0.0,-5.21 0.95,-9.94 2.82,-14.07c5.52,-12.2 17.74,-20.09 31.13,-20.09c18.83,0.0 34.16,15.32 34.16,34.16c0.0,7.2 -5.86,13.05 -13.05,13.05S52.0,62.92 52.0,55.73c0.0,-4.44 -3.61,-8.05 -8.05,-8.05s-8.05,3.61 -8.05,8.05c0.0,7.3 2.69,14.15 7.56,19.28c3.86,4.06 7.43,6.18 13.17,7.84c1.33,0.38 2.09,1.77 1.71,3.1C58.01,87.04 57.01,87.75 55.92,87.75z"/>
+    </group>
 </vector>
diff --git a/res/drawable/ring_progress.xml b/res/drawable/ring_progress.xml
new file mode 100644
index 0000000..02fcd5b
--- /dev/null
+++ b/res/drawable/ring_progress.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@android:id/background">
+        <shape
+            android:innerRadiusRatio="2.2"
+            android:shape="ring"
+            android:thickness="@dimen/ring_progress_bar_thickness"
+            android:useLevel="false"
+            android:tint="?android:colorControlNormal">
+            <solid android:color="@color/white_disabled" />
+        </shape>
+    </item>
+    <item android:id="@android:id/progress">
+        <rotate
+            android:fromDegrees="270"
+            android:pivotX="50%"
+            android:pivotY="50%"
+            android:toDegrees="270">
+            <shape
+                android:innerRadiusRatio="2.2"
+                android:shape="ring"
+                android:thickness="@dimen/ring_progress_bar_thickness"
+                android:tint="?android:attr/colorControlActivated">
+                <solid android:color="@android:color/white" />
+            </shape>
+        </rotate>
+    </item>
+</layer-list>
diff --git a/res/layout-land/fingerprint_enroll_enrolling.xml b/res/layout-land/fingerprint_enroll_enrolling.xml
index ba0f803..27af681 100644
--- a/res/layout-land/fingerprint_enroll_enrolling.xml
+++ b/res/layout-land/fingerprint_enroll_enrolling.xml
@@ -49,7 +49,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginStart="0dp"
                 android:layout_marginEnd="0dp"
-                android:src="@drawable/ic_lock" />
+                android:src="@drawable/ic_fingerprint_header" />
 
             <TextView
                 android:id="@+id/suw_layout_title"
@@ -97,8 +97,8 @@
             android:layout_height="match_parent">
 
             <include layout="@layout/fingerprint_enroll_enrolling_content"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
                 android:layout_gravity="center"/>
 
             <TextView
diff --git a/res/layout-land/fingerprint_enroll_find_sensor.xml b/res/layout-land/fingerprint_enroll_find_sensor.xml
index 0a3a33f..b64b27f 100644
--- a/res/layout-land/fingerprint_enroll_find_sensor.xml
+++ b/res/layout-land/fingerprint_enroll_find_sensor.xml
@@ -50,7 +50,7 @@
                     android:layout_height="wrap_content"
                     android:layout_marginStart="0dp"
                     android:layout_marginEnd="0dp"
-                    android:src="@drawable/ic_lock" />
+                    android:src="@drawable/ic_fingerprint_header" />
 
                 <TextView
                     android:id="@+id/suw_layout_title"
diff --git a/res/layout/battery_history_detail.xml b/res/layout/battery_history_detail.xml
index e254711..b782e39 100644
--- a/res/layout/battery_history_detail.xml
+++ b/res/layout/battery_history_detail.xml
@@ -14,54 +14,56 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:orientation="vertical">
+    android:layout_height="match_parent">
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:focusable="true"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
         android:orientation="vertical">
-        <TextView
-            android:id="@+id/charge"
+
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="36sp"
-            android:textColor="?android:attr/colorAccent" />
+            android:focusable="true"
+            android:orientation="vertical">
 
-        <TextView
-            android:id="@+id/estimation"
+            <TextView
+                android:id="@+id/charge"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:textSize="36sp"
+                android:textColor="?android:attr/colorAccent"/>
+
+            <TextView
+                android:id="@+id/estimation"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="8dp"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textColor="?android:attr/textColorSecondary"/>
+
+            <com.android.settingslib.graph.UsageView
+                android:id="@+id/battery_usage"
+                android:layout_width="match_parent"
+                android:layout_height="141dp"
+                settings:sideLabels="@array/battery_labels"
+                android:colorAccent="?android:attr/colorAccent"
+                android:gravity="end"
+                settings:textColor="?android:attr/textColorSecondary"/>
+        </LinearLayout>
+
+        <View
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingBottom="8dp"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="?android:attr/textColorSecondary" />
-
-        <com.android.settingslib.graph.UsageView
-            android:id="@+id/battery_usage"
-            android:layout_width="match_parent"
-            android:layout_height="141dp"
-            settings:sideLabels="@array/battery_labels"
-            android:colorAccent="?android:attr/colorAccent"
-            android:gravity="end"
-            settings:textColor="?android:attr/textColorSecondary" />
-    </LinearLayout>
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginTop="2dp"
-        android:background="?android:attr/listDivider" />
-
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
+            android:layout_height="1dp"
+            android:layout_marginTop="2dp"
+            android:background="?android:attr/listDivider"/>
 
         <LinearLayout
             android:layout_width="match_parent"
@@ -94,6 +96,6 @@
 
         </LinearLayout>
 
-    </ScrollView>
+    </LinearLayout>
 
-</LinearLayout>
+</ScrollView>
diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 1e5eb0b..33140d9 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -41,7 +41,7 @@
             android:text="@string/bluetooth_pairing_key_msg"
             android:visibility="gone"
             android:textAppearance="@android:style/TextAppearance.Material.Body1"
-            android:textColor="@*android:color/secondary_text_material_light"  />
+            android:textColor="@color/bluetooth_dialog_text_color"  />
 
         <TextView
             android:id="@+id/pairing_subhead"
@@ -64,7 +64,7 @@
             android:gravity="center_vertical"
             android:text="@string/bluetooth_enter_passkey_msg"
             android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:textColor="@*android:color/secondary_text_material_light"
+            android:textColor="@color/bluetooth_dialog_text_color"
             android:visibility="gone" />
 
         <CheckBox
@@ -74,7 +74,7 @@
             android:layout_marginStart="@dimen/bluetooth_dialog_padding"
             android:layout_marginEnd="@dimen/bluetooth_dialog_padding"
             android:textAppearance="@android:style/TextAppearance.Material.Body1"
-            android:textColor="@*android:color/secondary_text_material_light"  />
+            android:textColor="@color/bluetooth_dialog_text_color"  />
 
     </LinearLayout>
 
diff --git a/res/layout/condition_card.xml b/res/layout/condition_card.xml
index 7c9e46d..4edd0f2 100644
--- a/res/layout/condition_card.xml
+++ b/res/layout/condition_card.xml
@@ -66,7 +66,7 @@
         <LinearLayout
             android:id="@+id/detail_group"
             android:layout_width="match_parent"
-            android:layout_height="0dp"
+            android:layout_height="wrap_content"
             android:paddingStart="72dp"
             android:visibility="gone"
             android:orientation="vertical">
@@ -96,7 +96,7 @@
                 android:layout_height="wrap_content"
                 android:paddingTop="8dp"
                 android:paddingBottom="8dp"
-                style="?attr/buttonBarStyle"
+                style="?android:attr/buttonBarStyle"
                 android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
 
                 <Button
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
index 7c960a2..e6b7887 100644
--- a/res/layout/confirm_lock_pattern_base.xml
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -29,47 +29,54 @@
         android:layout_gravity="top|center_horizontal"
         android:paddingTop="@dimen/confirm_credentials_top_padding">
 
-        <TextView
-            style="@android:style/TextAppearance.Material.Headline"
-            android:id="@+id/headerText"
-            android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
-            android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
-            android:layout_marginTop="?attr/confirmDeviceCredentialsTopMargin"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textColor="?android:attr/colorAccent"/>
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="2">
 
-        <TextView
-            style="@android:style/TextAppearance.Material.Body1"
-            android:id="@+id/detailsText"
-            android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
-            android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
-            android:layout_marginTop="12dp"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            />
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="vertical">
 
-        <Button
-            style="@android:style/Widget.Material.Button.Borderless"
-            android:id="@+id/cancelButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/cancel"
-            android:layout_marginStart="16dp"
-            android:layout_marginEnd="16dp"
-            android:layout_marginTop="16dp"/>
+                <TextView
+                    style="@android:style/TextAppearance.Material.Headline"
+                    android:id="@+id/headerText"
+                    android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
+                    android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
+                    android:layout_marginTop="?attr/confirmDeviceCredentialsTopMargin"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="?android:attr/colorAccent"/>
 
-        <View android:layout_width="match_parent"
-              android:layout_height="0dp"
-              android:layout_weight="0.5"/>
+                <TextView
+                    style="@android:style/TextAppearance.Material.Body1"
+                    android:id="@+id/detailsText"
+                    android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
+                    android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
+                    android:layout_marginTop="12dp"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+                <Button
+                    style="@android:style/Widget.Material.Button.Borderless"
+                    android:id="@+id/cancelButton"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/cancel"
+                    android:layout_marginStart="16dp"
+                    android:layout_marginEnd="16dp"
+                    android:layout_marginTop="16dp"/>
+            </LinearLayout>
+
+        </ScrollView>
 
         <com.android.internal.widget.LockPatternView
             android:id="@+id/lockPattern"
             android:layout_width="312dp"
-            android:layout_height="312dp"
-            android:layout_gravity="center_horizontal"
-            android:layout_marginTop="-46dp"
-            android:layout_marginBottom="-46dp"/>
+            android:layout_height="0dp"
+            android:layout_weight="3"
+            android:layout_gravity="center_horizontal"/>
 
         <LinearLayout
             android:layout_width="match_parent"
diff --git a/res/layout/expand_preference.xml b/res/layout/expand_preference.xml
new file mode 100644
index 0000000..640cda7
--- /dev/null
+++ b/res/layout/expand_preference.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2016 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/selectable_card_grey"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:orientation="vertical"
+    android:paddingEnd="?android:attr/scrollbarSize">
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/fingerprint_enroll_enrolling_base.xml b/res/layout/fingerprint_enroll_enrolling_base.xml
index e9e3385..33a5acf 100644
--- a/res/layout/fingerprint_enroll_enrolling_base.xml
+++ b/res/layout/fingerprint_enroll_enrolling_base.xml
@@ -55,8 +55,9 @@
         </FrameLayout>
 
         <include layout="@layout/fingerprint_enroll_enrolling_content"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="@dimen/fingerprint_progress_bar_max_size"
+            android:layout_height="0dp"
+            android:layout_weight="1"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="@dimen/fingerprint_enrolling_content_margin_top"/>
 
diff --git a/res/layout/fingerprint_enroll_enrolling_content.xml b/res/layout/fingerprint_enroll_enrolling_content.xml
index 42769d1..1622f3f 100644
--- a/res/layout/fingerprint_enroll_enrolling_content.xml
+++ b/res/layout/fingerprint_enroll_enrolling_content.xml
@@ -15,32 +15,11 @@
   ~ limitations under the License
   -->
 
-<RelativeLayout
+<com.android.settings.widget.RingProgressBar
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fingerprint_progress_bar"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:layout_gravity="center_horizontal">
-
-    <ImageView
-        android:id="@+id/fingerprint_animator"
-        android:layout_width="@dimen/fingerprint_animation_size"
-        android:layout_height="@dimen/fingerprint_animation_size"
-        android:layout_centerInParent="true"
-        android:background="@drawable/fp_illustration_enrollment"
-        android:backgroundTint="@color/fingerprint_indicator_background_resting"
-        android:src="@drawable/enrollment_fingerprint_isolated_animation"/>
-
-    <ProgressBar
-        android:id="@+id/fingerprint_progress_bar"
-        android:layout_width="?attr/fingerprint_progress_bar_size"
-        android:layout_height="?attr/fingerprint_progress_bar_size"
-        android:layout_centerInParent="true"
-        style="?android:attr/progressBarStyleHorizontal"
-        android:max="10000"
-        android:mirrorForRtl="false"
-        android:progress="0"
-        android:indeterminate="false"
-        android:progressDrawable="@drawable/fingerprint_progress_ring"
-        android:rotation="-90"/>
-
-</RelativeLayout>
+    android:background="@drawable/fp_illustration"
+    android:minHeight="@dimen/fingerprint_progress_bar_min_size"
+    android:progress="0" />
diff --git a/res/layout/see_all.xml b/res/layout/see_all.xml
deleted file mode 100644
index 44b263c..0000000
--- a/res/layout/see_all.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<LinearLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="?android:attr/selectableItemBackground"
-        android:gravity="center_vertical"
-        android:minHeight="@dimen/dashboard_tile_minimum_height"
-        android:clickable="true"
-        android:focusable="true">
-
-    <View
-            android:layout_width="@dimen/dashboard_tile_image_size"
-            android:layout_height="@dimen/dashboard_tile_image_size"
-            android:layout_marginStart="@dimen/dashboard_tile_image_margin_start"
-            android:layout_marginEnd="@dimen/dashboard_tile_image_margin_end"
-            android:visibility="invisible" />
-
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="0dip"
-            android:orientation="vertical"
-            android:gravity="center_vertical"
-            android:layout_weight="1">
-
-            <RelativeLayout
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content">
-
-                <TextView android:id="@android:id/title"
-                          android:layout_width="wrap_content"
-                          android:layout_height="wrap_content"
-                          android:singleLine="true"
-                          android:textAppearance="@android:style/TextAppearance.Material.Widget.Button.Inverse"
-                          android:textColor="?android:attr/colorAccent"
-                          android:ellipsize="marquee"
-                          android:fadingEdge="horizontal" />
-
-            </RelativeLayout>
-
-        </LinearLayout>
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/res/layout/support_disclaimer_content.xml b/res/layout/support_disclaimer_content.xml
index d6697c3..196bef2 100644
--- a/res/layout/support_disclaimer_content.xml
+++ b/res/layout/support_disclaimer_content.xml
@@ -13,24 +13,27 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<LinearLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:padding="24dp">
-
-    <com.android.settings.widget.LinkTextView
-        android:id="@+id/support_disclaimer_text"
+    android:layout_height="wrap_content">
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingBottom="24dp"/>
+        android:orientation="vertical"
+        android:padding="24dp">
 
-    <CheckBox
-        android:id="@+id/support_disclaimer_do_not_show_again"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/support_disclaimer_do_not_show"
-        android:textColor="?android:attr/textColorSecondary"/>
+        <com.android.settings.widget.LinkTextView
+            android:id="@+id/support_disclaimer_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="24dp"/>
 
-</LinearLayout>
+        <CheckBox
+            android:id="@+id/support_disclaimer_do_not_show_again"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/support_disclaimer_do_not_show"
+            android:textColor="?android:attr/textColorSecondary"/>
+    </LinearLayout>
+</ScrollView>
diff --git a/res/layout/support_escalation_options.xml b/res/layout/support_escalation_options.xml
index b214561..63cc85d 100644
--- a/res/layout/support_escalation_options.xml
+++ b/res/layout/support_escalation_options.xml
@@ -42,7 +42,8 @@
         android:gravity="center_horizontal"
         android:orientation="horizontal">
         <LinearLayout
-            android:layout_width="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
             android:layout_height="wrap_content"
             android:layout_marginStart="8dp"
             android:layout_marginEnd="8dp"
@@ -63,7 +64,8 @@
                 android:textColor="?android:attr/textColorSecondary"/>
         </LinearLayout>
         <LinearLayout
-            android:layout_width="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
             android:layout_height="wrap_content"
             android:layout_marginStart="8dp"
             android:layout_marginEnd="8dp"
diff --git a/res/layout/support_tile.xml b/res/layout/support_tile.xml
index e5e49f4..e294868 100644
--- a/res/layout/support_tile.xml
+++ b/res/layout/support_tile.xml
@@ -34,7 +34,7 @@
         android:id="@+id/tile_title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:singleLine="true"
+        android:maxLines="2"
         android:textAppearance="@style/TextAppearance.TileTitle"
         android:ellipsize="end"
         android:fadingEdge="horizontal"/>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index ea33881..5707c1b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Ontkoppel"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Weergawe <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Vergeet VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Vervang bestaande VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Jy is reeds aan \'n VPN gekoppel. As jy aan \'n ander een koppel, sal jou bestaande VPN vervang word."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Vervang bestaande VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Stel altyd-aan VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"As jy hierdie instelling aanskakel, sal jy nie \'n internetverbinding hê totdat die VPN suksesvol koppel nie"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Jou bestaande VPN sal vervang word en jy sal nie \'n internetverbinding hê totdat die VPN suksesvol koppel nie"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Jy is reeds aan \'n altyd-aan VPN gekoppel. As jy aan \'n ander een koppel, sal jou bestaande VPN vervang word en sal altyd-aan-modus afgeskakel word."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Jy is reeds aan \'n VPN gekoppel. As jy aan \'n ander een koppel, sal jou bestaande VPN vervang word."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Skakel aan"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> kan nie koppel nie"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Hierdie program steun nie altyd-aan VPN nie."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Wys %d versteekte item</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Netwerk en internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Gekoppelde toestelle"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Programme en kennisgewings"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Gebruiker en rekeninge"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Programverstekke"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Taal: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Instellings"</string>
     <string name="search_menu" msgid="6283419262313758339">"Soekinstellings"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Soekinstellings"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Vervang werkprofielklanke?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Vervang"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Jou huidige werkprofielklanke sal vervang word met jou persoonlike profiel se klanke"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Stel kennisgewings op"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Gevorderd"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Werkkennisgewings"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Flikker kennisgewing-liggie"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Dinsdag 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Dinsdag 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Dinsdag 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Sien alles"</string>
-    <string name="see_less" msgid="1250265310929558370">"Sien minder"</string>
     <string name="disconnected" msgid="5787956818111197212">"Ontkoppel"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> van die data is gebruik"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 000fa48..4816de9 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ግንኙነት አቋርጥ"</string>
     <string name="vpn_version" msgid="1939804054179766249">"ሥሪት <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPNን እርሳ"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"አሁን ያለው VPN ይተካል?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"አስቀድመው ከአንድ ቪፒኤን ጋር ተገናኝተዋል። ከተለየ ጋር ከተገናኙ ነባሩ የእርስዎ ቪፒኤን ይተካል።"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"አሁን ያለው VPN ይተካ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"ሁልጊዜ-የበራ VPN ይቀናበር?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ይህን ቅንብር በማብራት VPN በተሳካ ሁኔታ እስኪገናኝ ድረስ የበይነመረብ ግንኙነት አይኖረዎትም"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"የእርስዎ ነባር VPN ይተካል፣ እና VPN በተሳካ ሁኔታ እስኪገናኝ ድረስ የበይነመረብ ግንኙነት አይኖረዎትም"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"አስቀድመው ሁልጊዜ ከበራ VPN ጋር ተገናኝተዋል። ከተለየ ጋር ከተገናኙ ነባሩ የእርስዎ VPN  ይተካል፣ እና የሁልጊዜ-በርቷል ሁነታ ይጠፋል።"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"አስቀድመው ከአንድ VPN ጋር ተገናኝተዋል። ከተለየ ጋር ከተገናኙ ነባሩ የእርስዎ VPN ይተካል።"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"አብራ"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> መገናኘት አልቻለም"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ይህ መተግበሪያ ሁልጊዜ-የሚበራ ቪፒኤን አይደግፍም።"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="other">%d የተደበቁ ንጥሎችን አሳይ</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"አውታረ መረብ እና በይነመረብ"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"የተገናኙ መሣሪያዎች"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"መተግበሪያዎች እና ማሳወቂያዎች"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ተጠቃሚ እና መለያዎች"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"የመተግበሪያ ነባሪዎች"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ቋንቋ፦ <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ቅንብሮች"</string>
     <string name="search_menu" msgid="6283419262313758339">"የፍለጋ ቅንብሮች"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"የፍለጋ ቅንብሮች"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"በመገለጫ ድምጾች ይተኩ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ተካ"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"የአሁኑ የስራ መገለጫዎ ድምጾች በግል መገለጫ ድምጾችዎ ይተካሉ"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"ማሳወቂያዎችን አዋቅር"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"የላቀ"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"የስራ ማሳወቂያዎች"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"የማሳወቂያ ብርሃን አሳይ"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"ማክሰኞ 6:10 ከሰዓት (አመሻሽ)"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"ማክሰኞ 6:02 ከሰዓት (አመሻሽ)"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"ማክሰኞ 6:03 ከሰዓት (አመሻሽ)"</string>
-    <string name="see_all" msgid="8883901630052886984">"ሁሉንም ይመልከቱ"</string>
-    <string name="see_less" msgid="1250265310929558370">"ያነሰ ይመልከቱ"</string>
     <string name="disconnected" msgid="5787956818111197212">"ግንኙነት ተቋርጧል"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ከውሂብ ጥቅም ላይ ውሏል"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 0bc0be2..5ff4ef8 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -2348,8 +2348,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"قطع الاتصال"</string>
     <string name="vpn_version" msgid="1939804054179766249">"الإصدار <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"نسيان الشبكة الظاهرية الخاصة"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"هل تريد استبدال الشبكة الظاهرية الخاصة الحالية؟"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"‏أنت متصل بالفعل بشبكة ظاهرية خاصة (VPN). وإذا اتصلت بشبكة ظاهرية خاصة أخرى، فسيتم استبدال شبكتك الظاهرية الخاصة الحالية."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"هل تريد استبدال الشبكة الظاهرية الخاصة الحالية؟"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"هل تريد تشغيل الشبكة الظاهرية الخاصة باستمرار؟"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"‏عند تشغيل هذا الإعداد، لن تتمكن من الاتصال بالإنترنت إلا بعد أن ينجح اتصال الشبكة الظاهرية الخاصة (VPN)"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"‏سيتم استبدال شبكتك الظاهرية الخاصة (VPN) الحالية ولن تتمكن من استخدام اتصال الإنترنت إلا بعد أن ينجح اتصال الشبكة الظاهرية الخاصة"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"‏أنت متصل حاليًا بشبكة ظاهرية خاصة (VPN) مضبوطة على وضع التشغيل الدائم. وإذا اتصلت بشبكة ظاهرية خاصة أخرى، فسيتم استبدال شبكتك الظاهرية الخاصة الحالية، كما سيتم إيقاف وضع التشغيل الدائم."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"‏أنت متصل حاليًا بشبكة ظاهرية خاصة (VPN). وإذا اتصلت بشبكة ظاهرية خاصة أخرى، فسيتم استبدال شبكتك الظاهرية الخاصة الحالية."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"تشغيل"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"يتعذر الاتصال بـ <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"‏لا يتوافق هذا التطبيق مع التشغيل الدائم للشبكة الظاهرية الخاصة (VPN)."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2611,8 +2616,11 @@
       <item quantity="one">‏عرض %d عنصر مخفي</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"الشبكة والإنترنت"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"الأجهزة المرتبطة"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"التطبيقات والإشعارات"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"المستخدم والحسابات"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"الاعدادات الافتراضية للتطبيق"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"اللغة: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"الإعدادات"</string>
     <string name="search_menu" msgid="6283419262313758339">"إعدادات البحث"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"إعدادات البحث"</string>
@@ -2714,7 +2722,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"أتستبدل أصوات ملف العمل؟"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"استبدال"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"سيتم استبدال الأصوات الحالية للملف الشخصي للعمل بأصوات ملفك الشخصي على حسابك الشخصي."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"تهيئة الإشعارات"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"متقدمة"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"إشعارات العمل"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ضوء الاشعار بالنبض"</string>
@@ -3152,8 +3161,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"الثلاثاء ٦:٠١ م"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"الثلاثاء ٦:٠٢ م"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"الثلاثاء ٦:٠٣ م"</string>
-    <string name="see_all" msgid="8883901630052886984">"عرض الكل"</string>
-    <string name="see_less" msgid="1250265310929558370">"عرض عناصر أقل"</string>
     <string name="disconnected" msgid="5787956818111197212">"تم قطع الاتصال"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"تم استخدام <xliff:g id="AMOUNT">%1$s</xliff:g> من البيانات"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 7fd0f1c..ae1fdc6 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Bağlantını kəsin"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versiya <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN\'i unudun"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Mövcud VPN əvəz edilsin?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Artıq VPN\'ə qoşulmusunuz. Əgər başqa birinə qoşulsanız, mövcud VPN əvəz ediləcək."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Mövcud VPN əvəz edilsin?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Hər zaman aktiv VPN quraşdırılsın?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Bu ayarı aktiv etməklə, uğurlu VPN bağlantısına kimi İnternet bağlantınız olmayacaq"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Mövcud VPN əvəz ediləcək və uğurlu VPN bağlantısına kimi İnternet bağlantınız olmayacaq"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Artıq hər zaman aktiv VPN\'ə qoşulmusunuz. Əgər başqa birinə qoşulsanız, mövcud VPN əvəz ediləcək və hər zaman aktiv rejimi deaktiv ediləcək."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Artıq VPN\'ə qoşulmusunuz. Əgər başqa birinə qoşulsanız, mövcud VPN əvəz ediləcək."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktiv edin"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> qoşula bilməz"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Bu tətbiq hər zaman aktiv olan VPN\'i dəstəkləmir."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">%d gizli element göstərin</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Şəbəkə və İnternet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Qoşulmuş cihazlar"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Tətbiq və bildirişlər"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"İstifadəçi və hesablar"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Tətbiq defoltları"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Dil: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Ayarlar"</string>
     <string name="search_menu" msgid="6283419262313758339">"Axtarış ayarları"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Axtarış ayarları"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"İş profili səsləri əvəz edilsin?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Əvəz edin"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Cari iş profili səsləriniz şəxsi profil səsləri ilə əvəz olunacaq"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfiqurasiya bildirişləri"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Qabaqcıl"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"İş bildirişləri"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Puls bildiriş işığı"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Ç.a 6:01GƏ"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Ç.a 6:02GƏ"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Ç.a 6:03GƏ"</string>
-    <string name="see_all" msgid="8883901630052886984">"Hamısına baxın"</string>
-    <string name="see_less" msgid="1250265310929558370">"Baxışı kiçildin"</string>
     <string name="disconnected" msgid="5787956818111197212">"Bağlantı kəsilib"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> data istifadə edildi"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 15a42e8..2938e65 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -2297,8 +2297,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Prekini vezu"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Verzija <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Zaboravi VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Želite li da zamenite postojeći VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Već ste povezani sa VPN-om. Kada biste se povezali sa nekim drugim VPN-om, postojeći VPN bi bio zamenjen."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Želite li da zamenite postojeći VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Želite li da podesite uvek uključeni VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ako uključite ovo podešavanje, nećete imati internet vezu dok se VPN ne poveže"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Postojeći VPN će biti zamenjen i nećete imati internet vezu dok se VPN ne poveže"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Već ste povezani sa uvek uključenim VPN-om. Ako se povežete sa nekim drugim, postojeći VPN će biti zamenjen, a režim Uvek uključen će biti isključen."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Već ste povezani sa VPN-om. Ako se povežete sa nekim drugim, postojeći VPN će biti zamenjen."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Uključi"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Povezivanje sa VPN-om <xliff:g id="VPN_NAME">%1$s</xliff:g> nije uspelo"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ova aplikacija ne podržava stalno uključeni VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2545,8 +2550,11 @@
       <item quantity="other">Prikaži %d skrivenih stavki</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Mreža i internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Povezani uređaji"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikacije i obaveštenja"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Korisnik i nalozi"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Podrazumevane aplikacije"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Podešavanja"</string>
     <string name="search_menu" msgid="6283419262313758339">"Pretražite podešavanja"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Podešavanja pretrage"</string>
@@ -2648,7 +2656,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Zameniti zvuke profila za Work?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Zameni"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Aktuelni zvuci profila za Work će biti zamenjeni zvucima sa ličnog profila"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurišite obaveštenja"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Podešavanja obaveštenja"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Napredna"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Obaveštenja za Work"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsirajuće obaveštenje"</string>
@@ -3062,8 +3070,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Uto 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Uto 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Uto 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Prikaži sve"</string>
-    <string name="see_less" msgid="1250265310929558370">"Prikaži manje"</string>
     <string name="disconnected" msgid="5787956818111197212">"Veza je prekinuta"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Koristi se <xliff:g id="AMOUNT">%1$s</xliff:g> podataka"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml
index 94c5cd7..41b81e5 100644
--- a/res/values-be-rBY/strings.xml
+++ b/res/values-be-rBY/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Адключыць"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Версія <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Забыць VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Замяніць існуючую VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Вы ўжо падключаны да VPN. Калі вы падключыцеся да іншай, ваша існуючая VPN будзе заменена."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Замяніць існуючую VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Наладзіць заўсёды ўключаную VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Калі вы ўключыце гэту наладу, у вас не будзе падключэння да інтэрнэту, пакуль VPN паспяхова не падключыцца"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Ваша існуючая VPN будзе заменена, і ў вас не будзе падключэння да інтэрнэту, пакуль VPN паспяхова не падключыцца"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Вы ўжо падключаны да заўсёды ўключанай VPN. Калі вы падключыцеся да іншай, ваша існуючая VPN будзе заменена, а рэжым \"заўсёды ўключана\" будзе адключаны."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Вы ўжо падключаны да VPN. Калі вы падключыцеся да іншай, ваша існуючая VPN будзе заменена."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Уключыць"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> не можа падключыцца"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Гэта праграма не падтрымлівае пастаянна ўключаную VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2567,8 +2572,11 @@
       <item quantity="other">Паказаць %d схаванага элемента</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Сетка і інтэрнэт"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Падключаныя прылады"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Праграмы і апавяшчэнні"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Карыстальнік і ўліковыя запісы"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Cтандартныя налады праграмы"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Мова: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Налады"</string>
     <string name="search_menu" msgid="6283419262313758339">"Налады пошуку"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Налады пошуку"</string>
@@ -2670,7 +2678,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Замяніць гукі прац. профілю?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Замяніць"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Вашы бягучыя гукі працоўнага профілю будуць заменены гукамі вашага асабістага профілю"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Наладзіць апавяшчэнні"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Пашыраныя"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Апавяшчэнні працоўнага профілю"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Мігценне індыкатара апавяшчэння"</string>
@@ -3092,8 +3101,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Аўторак, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Аўторак, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Аўторак, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Прагледзець усё"</string>
-    <string name="see_less" msgid="1250265310929558370">"Паказаць менш"</string>
     <string name="disconnected" msgid="5787956818111197212">"Адлучана"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> трафіку выкарыстана"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 025185b..180c787 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Прекратяване на връзката"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Версия <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Забравяне на вирт. частна мрежа (VPN)"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Да се замени ли съществуващата VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Вече сте свързани с виртуална частна мрежа (VPN). Ако установите връзка с друга VPN, съществуващата ще бъде заменена."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Да се замени ли съществуващата VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Да се зададе ли винаги включена виртуална частна мрежа (VPN)?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ако включите тази настройка, няма да имате достъп до интернет, докато не се установи успешна връзка с виртуалната частна мрежа (VPN)"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Съществуващата ви виртуална частна мрежа (VPN) ще бъде заменена и няма да имате достъп до интернет, докато не се установи успешна връзка с новата VPN"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Вече сте свързани с винаги включена виртуална частна мрежа (VPN). Ако установите връзка с друга VPN, съществуващата ще бъде заменена и режимът за винаги включена виртуална частна мрежа ще се деактивира."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Вече сте свързани с виртуална частна мрежа (VPN). Ако установите връзка с друга VPN, съществуващата ще бъде заменена."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Включване"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Не може да се установи връзка с мрежата „<xliff:g id="VPN_NAME">%1$s</xliff:g>“"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Това приложение не поддържа винаги включени VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Показване на %d скрит елемент</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Мрежа и интернет"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Свързани устройства"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Приложения и известия"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Потребител и профили"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Стандартни настройки на приложението"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Език: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Настройки"</string>
     <string name="search_menu" msgid="6283419262313758339">"Търсете в настройките"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Настройки за търсене"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Замяна на звуците за служебния потребителски профил?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Замяна"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Текущите звуци за служебния ви потребителски профил ще бъдат заменени с тези за личния ви"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Конфигуриране на известията"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Предпочитания за известията"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Разширени"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Служебни известия"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Пулсираща светлина"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"вт, 18:01 ч."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"вт, 18:02 ч."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"вт, 18:03 ч."</string>
-    <string name="see_all" msgid="8883901630052886984">"Преглед на всичко"</string>
-    <string name="see_less" msgid="1250265310929558370">"Преглед на по-малко"</string>
     <string name="disconnected" msgid="5787956818111197212">"Връзката е прекратена"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Използвали сте <xliff:g id="AMOUNT">%1$s</xliff:g> от данните"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index a97819b..56137cb 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"সংযোগ বিচ্ছিন্ন করুন"</string>
     <string name="vpn_version" msgid="1939804054179766249">"<xliff:g id="VERSION">%s</xliff:g> সংস্করণ"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN সরিয়ে দিন"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"বিদ্যমান VPN প্রতিস্থাপন করতে চান?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"আপনি ইতিমধ্যেই একটি VPN এর সাথে সংযুক্ত রয়েছেন৷ যদি আপনি অন্য আরেকটিতে সংযুক্ত করে থাকেন তবে আপনার বিদ্যমান VPN প্রতিস্থাপন করা হবে৷"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"বিদ্যমান VPN প্রতিস্থাপন করতে চান?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"সর্বদা-চালু VPN সেট করতে চান?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"এই সেটিং চালু করলে, VPN সফলভাবে সংযুক্ত না হওয়া পর্যন্ত আপনার কাছে কোনো ইন্টারনেট সংযোগ থাকবে না"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"আপনার বিদ্যমান VPN প্রতিস্থাপন করা হবে এবং VPN সফলভাবে সংযুক্ত না হওয়া পর্যন্ত আপনার কাছে কোনো ইন্টারনেট সংযোগ থাকবে না"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"আপনি ইতিমধ্যেই একটি সর্বদা-চালু VPN এর সাথে সংযুক্ত রয়েছেন৷ আপনি যদি অন্য আরেকটিতে সংযোগ করেন তবে আপনার বিদ্যমান VPN প্রতিস্থাপন করা হবে এবং সর্বদা-চালু মোড বন্ধ হবে৷"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"আপনি ইতিমধ্যেই একটি VPN এর সাথে সংযুক্ত রয়েছেন৷ যদি আপনি অন্য আরেকটিতে সংযুক্ত করে থাকেন তবে আপনার বিদ্যমান VPN প্রতিস্থাপন করা হবে৷"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"চালু করুন"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> সংযোগ করতে পারেনি"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"এই অ্যাপ্লিকেশানটি সর্বদা-চালু VPN সমর্থন করে না৷"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">%dটি লুকানো আইটেম দেখান</item>
       <item quantity="other">%dটি লুকানো আইটেম দেখান</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"নেটওয়ার্ক ও ইন্টারনেট"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"সংযুক্ত ডিভাইস"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"অ্যাপ্স &amp; বিজ্ঞপ্তিগুলি"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ব্যবহারকারি &amp; অ্যাকাউন্টগুলি"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"অ্যাপ ডিফল্টগুলি"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ভাষা: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"সেটিংস"</string>
     <string name="search_menu" msgid="6283419262313758339">"অনুসন্ধান সেটিংস"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"অনুসন্ধান সেটিংস"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"কর্মস্থলের প্রোফাইলের ধ্বনিগুলিকে প্রতিস্থাপন করতে চান?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"প্রতিস্থাপন করুন"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"আপনার বর্তমান কর্মস্থালের প্রোফাইলের ধ্বনিগুলিকে আপনার ব্যক্তিগত প্রোফাইলের ধ্বনিগুলির সাথে প্রতিস্থাপন করা হবে"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"বিজ্ঞপ্তি কনফিগার করুন"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"উন্নত"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"কর্মস্থলের বিজ্ঞপ্তিগুলি"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"পাল্স বিজ্ঞপ্তির জন্য আলো"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"মঙ্গলবার সন্ধ্যা ৬.০১ এ"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"মঙ্গলবার সন্ধ্যা ৬.০২ এ"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"মঙ্গলবার সন্ধ্যা ৬.০৩ এ"</string>
-    <string name="see_all" msgid="8883901630052886984">"সবগুলি দেখুন"</string>
-    <string name="see_less" msgid="1250265310929558370">"কম দেখুন"</string>
     <string name="disconnected" msgid="5787956818111197212">"সংযোগ বিচ্ছিন্ন হয়েছে"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ডেটা ব্যবহৃত হয়েছে"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
index 0ff7283..f4543e1 100644
--- a/res/values-bs-rBA/strings.xml
+++ b/res/values-bs-rBA/strings.xml
@@ -2297,8 +2297,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Prekini vezu"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Verzija <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Zaboravi VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Želite li zamijeniti postojeći VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Već ste povezani na VPN. Ako se povežete na drugi VPN, postojeći VPN će biti zamijenjen."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Želite li zamijeniti postojeći VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Želite li postaviti uvijek uključen VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ako uključite ovu postavku, nećete imati internetsku vezu dok se VPN ne poveže uspješno."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Vaša postojeći VPN će biti zamijenjen i nećete imati internetsku vezu dok se VPN ne poveže uspješno."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Već ste povezani na \"uvijek uključen\" VPN. Ako se povežete na drugu mrežu, vaša postojeća VPN će biti zamijenjena, a način rada \"uvijek uključeno\" će se isključiti."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Već ste povezani na VPN. Ako se povežete na drugu, postojeći VPN će biti zamijenjen."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Uključi"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> se ne može povezati"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ova aplikacija ne podržava uvijek aktivni VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2545,8 +2550,11 @@
       <item quantity="other">Prikaži %d skrivenih stavki</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Mreža i internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Povezani uređaji"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikacije i obavještenja"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Korisnik i računi"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Zadane akcije aplikacije"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Postavke"</string>
     <string name="search_menu" msgid="6283419262313758339">"Postavke pretraživanja"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Postavke pretraživanja"</string>
@@ -2648,7 +2656,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Želite li zamijeniti zvuke radnog profila?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Zamijeni"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Postojeći zvuci vašeg radnog profila će se zamijeniti zvucima vašeg ličnog profila"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfiguriraj obavještenja"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Napredno"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Obavještenja za posao"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsirajuće svjetlo obavještenja"</string>
@@ -3062,8 +3071,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Uto 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Uto 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Uto 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Prikaži sve"</string>
-    <string name="see_less" msgid="1250265310929558370">"Vidi manje"</string>
     <string name="disconnected" msgid="5787956818111197212">"Isključen"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> podataka u upotrebi"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 41b9f7c..6a3c14c 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desconnecta"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versió <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Oblida la VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Vols substituir la VPN actual?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Ja t\'has connectat a una VPN. Si et connectes a una altra VPN, se substituirà l\'actual."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Vols substituir la VPN actual?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Vols definir la VPN sempre activa?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"En activar aquesta opció de configuració, no tindràs connexió a Internet fins que la VPN es connecti correctament"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"La VPN existent se substituirà i no tindràs connexió a Internet fins que la VPN es connecti correctament"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Ja estàs connectat a una VPN que està sempre activa. Si et connectes a una altra, se substituirà la VPN existent i el mode sempre actiu es desactivarà."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Ja t\'has connectat a una VPN. Si et connectes a una altra VPN, se substituirà l\'actual."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activa"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"No es pot connectar amb <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Aquesta aplicació no és compatible amb una VPN sempre activada."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Mostra %d element amagat</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Xarxa i Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositius connectats"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplicacions i notificacions"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Usuari i comptes"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Valors predeterminats de l\'aplicació"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Configuració"</string>
     <string name="search_menu" msgid="6283419262313758339">"Configuració de la cerca"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Configuració de la cerca"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Subst. sons del perfil prof.?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Substitueix"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"El sons actuals del teu perfil professional se substituiran pels del perfil personal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configura les notificacions"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferències de notificació"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avançada"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificacions de la feina"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Llum de notificació"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Dimarts a les 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Dimarts a les 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Dimarts a les 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Mostra-ho tot"</string>
-    <string name="see_less" msgid="1250265310929558370">"Mostra\'n menys"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desconnectada"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de dades utilitzades"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index aab8f9a..ff297eb 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -811,7 +811,7 @@
     <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP adresa"</string>
     <string name="wifi_saved_access_points_label" msgid="2013409399392285262">"Uložené sítě"</string>
     <string name="wifi_advanced_settings_label" msgid="3654366894867838338">"Nastavení IP adresy"</string>
-    <string name="wifi_advanced_not_available" msgid="5823045095444154586">"Pokročilá nastavení sítě Wi-Fi nejsou pro tohoto uživatele dostupná."</string>
+    <string name="wifi_advanced_not_available" msgid="5823045095444154586">"Rozšířená nastavení sítě Wi-Fi nejsou pro tohoto uživatele dostupná."</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Uložit"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Zrušit"</string>
     <string name="wifi_ip_settings_invalid_ip_address" msgid="2513142355364274970">"Zadejte platnou IP adresu."</string>
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Odpojit"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Verze <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Zapomenout VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Nahradit stávající síť VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Již jste připojeni k síti VPN. Pokud se připojíte k jiné, stávající bude nahrazena."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Nahradit stávající síť VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Nastavit trvalou síť VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Pokud toto nastavení zapnete, do úspěšného připojení k VPN budete odpojeni od internetu"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Stávající síť VPN bude nahrazena a do jejího úspěšného připojení budete odpojeni od internetu."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Již jste připojeni k trvalé síti VPN. Pokud se připojíte k jiné, stávající síť VPN bude nahrazena a trvalý režim vypnut."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Již jste připojeni k síti VPN. Pokud se připojíte k jiné, stávající síť VPN bude nahrazena."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Zapnout"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Síť <xliff:g id="VPN_NAME">%1$s</xliff:g> se nedokáže připojit"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Tato aplikace nepodporuje trvalou síť VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"Síť VPN"</string>
@@ -2567,8 +2572,11 @@
       <item quantity="one">Zobrazit %d skrytou položku</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Síť a internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Připojená zařízení"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikace a oznámení"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Uživatel a účty"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Výchozí aplikace"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Jazyk: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Nastavení"</string>
     <string name="search_menu" msgid="6283419262313758339">"Nastavení vyhledávání"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Vyhledávání nastavení"</string>
@@ -2670,7 +2678,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Nahradit zvuky prac. profilu?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Nahradit"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Zvuky aktuálního pracovního profilu budou nahrazeny zvuky z osobního profilu"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurovat oznámení"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Nastavení oznámení"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Rozšířená nastavení"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Pracovní oznámení"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Blikat kontrolkou oznámení"</string>
@@ -3092,8 +3100,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Út 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Út 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Út 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Zobrazit vše"</string>
-    <string name="see_less" msgid="1250265310929558370">"Zobrazit méně"</string>
     <string name="disconnected" msgid="5787956818111197212">"Odpojeno"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Využití dat: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index d33c683..75668c8 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -1341,7 +1341,7 @@
     <string name="legal_information" msgid="5769301644270604095">"Juridiske oplysninger"</string>
     <string name="contributors_title" msgid="5917703088825286504">"Bidragydere"</string>
     <string name="manual" msgid="3025943393642974445">"Brugervejledning"</string>
-    <string name="regulatory_labels" msgid="1293050314122427492">"Etiketter for regler"</string>
+    <string name="regulatory_labels" msgid="1293050314122427492">"Certificeringer"</string>
     <string name="safety_and_regulatory_info" msgid="5103161279848427185">"Brugervejledning i sikkerhed og regler"</string>
     <string name="copyright_title" msgid="865906688917260647">"Ophavsret"</string>
     <string name="license_title" msgid="1990487604356037871">"Licens"</string>
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Afbryd"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Glem VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Vil du erstatte det eksisterende VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Du har allerede forbindelse til et VPN. Hvis du opretter forbindelse til et andet, erstattes dit eksisterende VPN."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Erstat det eksisterende VPN-netværk?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Skal VPN altid være slået til?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Hvis du aktiverer denne indstilling, vil du ikke have nogen internetforbindelse, før VPN-netværket etablerer forbindelse."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Dit eksisterende VPN-netværk erstattes, og du vil ikke have nogen internetforbindelse, før VPN-netværket etablerer forbindelse."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Du har allerede forbindelse til et VPN-netværk, der altid er slået til. Hvis du opretter forbindelse til et andet netværk, erstattes dit eksisterende VPN, og Altid slået til-tilstanden deaktiveres."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Du har allerede forbindelse til et VPN-netværk. Hvis du opretter forbindelse til et andet, erstattes dit eksisterende VPN."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktivér"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> kan ikke oprette forbindelse"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Denne app understøtter ikke VPN, der altid er aktiveret."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,17 +2527,19 @@
       <item quantity="one">Vis %d skjult element</item>
       <item quantity="other">Vis %d skjulte elementer</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Netværk &amp; internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Tilsluttede enheder"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps og underretninger"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Bruger og konti"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Appstandarder"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Sprog: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Indstillinger"</string>
     <string name="search_menu" msgid="6283419262313758339">"Søgeindstillinger"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Indstillinger for søgning"</string>
     <string name="search_recents_queries_label" msgid="2128811638532309069">"Seneste søgninger"</string>
     <string name="search_results_label" msgid="4163304782363526148">"Resultater"</string>
     <string name="keywords_wifi" msgid="1395786161993828719">"wifi, wi-fi, netværksforbindelse"</string>
-    <string name="keywords_more_default_sms_app" msgid="2265154063220360784">"sms-besked, sms, beskeder, chat"</string>
+    <string name="keywords_more_default_sms_app" msgid="2265154063220360784">"sms, sende sms-beskeder, beskeder, chat"</string>
     <string name="keywords_more_mobile_networks" msgid="1538131503712402851">"mobil, mobilselskab, trådløs, data, 4g, 3g, 2g, lte"</string>
     <string name="keywords_wifi_calling" msgid="1784064367330122679">"wifi, wi-fi, ring op, opkald"</string>
     <string name="keywords_home" msgid="3626170808219458848">"starter"</string>
@@ -2616,7 +2623,7 @@
     <string name="zen_mode_option_alarms" msgid="5785372117288803600">"Kun alarmer"</string>
     <string name="zen_mode_option_no_interruptions" msgid="8107126344850276878">"Total stilhed"</string>
     <string name="zen_mode_summary_combination" msgid="8715563402849273459">"<xliff:g id="MODE">%1$s</xliff:g>: <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
-    <string name="zen_mode_visual_interruptions_settings_title" msgid="6751708745442997940">"Bloker synsforstyrrelser"</string>
+    <string name="zen_mode_visual_interruptions_settings_title" msgid="6751708745442997940">"Bloker visuelle forstyrrelser"</string>
     <string name="sound_work_settings" msgid="6774324553228566442">"Lyde for arbejdsprofil"</string>
     <string name="work_use_personal_sounds_title" msgid="1148331221338458874">"Brug lyde fra privat profil"</string>
     <string name="work_use_personal_sounds_summary" msgid="2940241783139859361">"Lydene for arbejdsprofil er de samme som din private profil"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Erstat lyde for arbejdsprofil?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Erstat"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Dine aktuelle lyde for din arbejdsprofil erstattes af lydene fra din private profil"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurer underretninger"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Avanceret"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Arbejdsunderretninger"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Blink ved nye underretninger"</string>
@@ -2761,10 +2769,10 @@
     <string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Skift til Kun alarmer frem til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
     <string name="zen_mode_summary_always" msgid="6172985102689237703">"Skift til Afbryd altid"</string>
     <string name="zen_mode_screen_on" msgid="7712038508173845101">"Bloker, når skærmen er tændt"</string>
-    <string name="zen_mode_screen_on_summary" msgid="6444425984146305149">"Undgå, at underretninger, der er lydløse, når Forstyr ikke er slået til, vises på skærmen"</string>
+    <string name="zen_mode_screen_on_summary" msgid="6444425984146305149">"Underretninger, der gøres lydløse af Forstyr ikke, vises ikke på skærmen"</string>
     <string name="zen_mode_screen_off" msgid="5026854939192419879">"Bloker, når skærmen er slukket"</string>
-    <string name="zen_mode_screen_off_summary" msgid="6490932947651798094">"Undgå, at underretninger, der er lydløse, når Forstyr ikke er slået til, tænder skærmen eller får underretningslyset til at blinke"</string>
-    <string name="zen_mode_screen_off_summary_no_led" msgid="3758698381956461866">"Undgå, at underretninger, der er lydløse, når Forstyr ikke er slået til, tænder skærmen"</string>
+    <string name="zen_mode_screen_off_summary" msgid="6490932947651798094">"Underretninger, der gøres lydløse af Forstyr ikke, tænder ikke skærmen og får ikke underretningslyset til at blinke"</string>
+    <string name="zen_mode_screen_off_summary_no_led" msgid="3758698381956461866">"Underretninger, der gøres lydløse af Forstyr ikke, tænder ikke skærmen"</string>
     <string name="zen_mode_all_visual_interruptions" msgid="2851308980832487411">"Fra"</string>
     <string name="zen_mode_screen_on_visual_interruptions" msgid="7373348148129140528">"Når skærmen er tændt"</string>
     <string name="zen_mode_screen_off_visual_interruptions" msgid="4850792880144382633">"Når skærmen er slukket"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Tir. 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Tir. 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Tir. 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Se alle"</string>
-    <string name="see_less" msgid="1250265310929558370">"Se mindre"</string>
     <string name="disconnected" msgid="5787956818111197212">"Afbrudt"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Du har brugt <xliff:g id="AMOUNT">%1$s</xliff:g> data"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index f1228f4..9c18935 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Verbindung trennen"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN entfernen"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Aktuelles VPN ersetzen?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Du bist schon mit einem VPN verbunden. Wenn du eine Verbindung mit einem anderen VPN herstellst, wird dein aktuelles ersetzt."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Aktuelles VPN ersetzen?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Durchgehend aktives VPN aktivieren?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Wenn du diese Einstellung aktivierst, wird die Internetverbindung erst dann hergestellt, wenn eine VPN-Verbindung besteht"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Dein aktuelles VPN wird ersetzt. Die Internetverbindung wird erst dann hergestellt, wenn eine VPN-Verbindung besteht"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Du bist schon mit einem durchgehend aktiven VPN verbunden. Wenn du eine Verbindung mit einem anderen VPN herstellst, wird dein aktuelles ersetzt und der Modus \"Durchgehend aktives VPN\" wird deaktiviert."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Du bist schon mit einem VPN verbunden. Wenn du eine Verbindung mit einem anderen VPN herstellst, wird dein aktuelles ersetzt."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktivieren"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Verbindung zu <xliff:g id="VPN_NAME">%1$s</xliff:g> kann nicht hergestellt werden"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Bei dieser App wird Always-On-VPN nicht unterstützt."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2355,7 +2360,7 @@
     <string name="user_summary_managed_profile_not_set_up" msgid="1659125858619760573">"Nicht eingerichtet – Arbeitsprofil"</string>
     <string name="user_admin" msgid="993402590002400782">"Administrator"</string>
     <string name="user_you" msgid="1639158809315025986">"Ich (<xliff:g id="NAME">%s</xliff:g>)"</string>
-    <string name="user_nickname" msgid="5148818000228994488">"Alias"</string>
+    <string name="user_nickname" msgid="5148818000228994488">"Spitzname"</string>
     <string name="user_add_user_type_title" msgid="2146438670792322349">"Hinzufügen"</string>
     <string name="user_add_max_count" msgid="5405885348463433157">"Du kannst bis zu <xliff:g id="USER_COUNT">%1$d</xliff:g> Nutzer hinzufügen."</string>
     <string name="user_add_user_item_summary" msgid="4702776187132008661">"Die Nutzer haben eigene Apps und Inhalte."</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">%d ausgeblendetes Element anzeigen</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Netzwerk &amp; Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Verbundene Geräte"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps &amp; Benachrichtigungen"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Nutzer &amp; Konten"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"App-Standardeinstellungen"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Sprache: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Einstellungen"</string>
     <string name="search_menu" msgid="6283419262313758339">"Sucheinstellungen"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Sucheinstellungen"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Töne für Arbeitsprofil ersetzen?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Ersetzen"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Deine aktuellen Töne für das Arbeitsprofil werden durch die Töne für das persönliche Profil ersetzt"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Benachrichtigungen"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Benachrichtigungseinstellungen"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Erweitert"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Geschäftliche Benachrichtigungen"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Benachrichtigungslicht"</string>
@@ -3034,8 +3042,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Di. 18:01 Uhr"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Di. 18:02 Uhr"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Di. 18:03 Uhr"</string>
-    <string name="see_all" msgid="8883901630052886984">"Alle anzeigen"</string>
-    <string name="see_less" msgid="1250265310929558370">"Weniger anzeigen"</string>
     <string name="disconnected" msgid="5787956818111197212">"Verbindung getrennt"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> genutzt"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
@@ -3186,7 +3192,7 @@
     <string name="support_escalation_title" msgid="4111071371281023145">"Wir sind für dich da"</string>
     <string name="support_escalation_24_7_title" msgid="8118369197749832074">"Wir sind täglich rund um die Uhr für dich da"</string>
     <string name="support_escalation_24_7_content_description" msgid="3772776213036994533">"Wir sind täglich rund um die Uhr für dich da"</string>
-    <string name="support_escalation_summary" msgid="8473084168776014405">"Unser Kundenservice hilft dir beim Lösen von Problemen"</string>
+    <string name="support_escalation_summary" msgid="8473084168776014405">"Unser Kundenservice hilft dir gerne weiter"</string>
     <string name="support_escalation_24_7_summary" msgid="2802773279262547187">"Unser Kundenservice steht täglich rund um die Uhr zur Verfügung"</string>
     <string name="support_escalation_closed_summary" msgid="2240967274380168303">"Durchsuche die Hilfe oder versuche es noch einmal während der Geschäftszeiten des Supports (Ortszeit):&lt;br&gt;&lt;b&gt;<xliff:g id="OPERATION_HOURS">%s</xliff:g>&lt;/b&gt;"</string>
     <string name="support_escalation_no_internet_summary" msgid="2526082812336597989">"Geschäftszeiten des telefonischen Supports (Ortszeit)&lt;br&gt;&lt;b&gt;<xliff:g id="OPERATION_HOURS">%s</xliff:g>&lt;/b&gt;"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index eac5eaa..8a88794 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -756,7 +756,7 @@
     <string name="wifi_wps_nfc_enter_password" msgid="2288214226916117159">"Εισαγάγετε κωδικό πρόσβασης δικτύου"</string>
     <string name="wifi_scan_always_turnon_message" msgid="203123538572122989">"Για τη βελτίωση της ακρίβειας της τοποθεσίας σας και για άλλους σκοπούς, η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> επιθυμεί να ενεργοποιήσει τη σάρωση δικτύων, ακόμη και όταν το Wi-Fi είναι απενεργοποιημένο.\n\nΝα επιτρέπεται αυτή η ενέργεια για όλες τις εφαρμογές που επιθυμούν σάρωση;"</string>
     <string name="wifi_scan_always_turnoff_message" msgid="5538901671131941043">"Για να το απενεργοποιήσετε, μεταβείτε στις Σύνθετες ρυθμίσεις, στο μενού υπερχείλισης."</string>
-    <string name="wifi_scan_always_confirm_allow" msgid="5355973075896817232">"Να επιτραπεί"</string>
+    <string name="wifi_scan_always_confirm_allow" msgid="5355973075896817232">"Να επιτρέπεται"</string>
     <string name="wifi_scan_always_confirm_deny" msgid="4463982053823520710">"Απόρριψη"</string>
     <string name="wifi_hotspot_title" msgid="7726205804813286950">"Να γίνει σύνδεση στο σημείο πρόσβασης Wi-Fi;"</string>
     <string name="wifi_hotspot_message" msgid="3673833421453455747">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> απαιτεί σύνδεση διαδικτύου, πριν από τη σύνδεση στο δίκτυο."</string>
@@ -1240,8 +1240,8 @@
     <string name="master_clear_accounts" product="default" msgid="6412857499147999073">\n\n"Αυτήν τη στιγμή είστε συνδεδεμένοι στους παρακάτω λογαριασμούς:\n"</string>
     <string name="master_clear_other_users_present" product="default" msgid="5161423070702470742">\n\n"Υπάρχουν άλλοι χρήστες σε αυτήν τη συσκευή.\n"</string>
     <string name="master_clear_desc_also_erases_external" msgid="1903185203791274237"><li>"Μουσική"</li>\n<li>"Φωτογραφίες"</li>\n<li>"Άλλα δεδομένα χρήστη"</li></string>
-    <string name="master_clear_desc_erase_external_storage" product="nosdcard" msgid="7744115866662613411">\n\n"Πρέπει να γίνει διαγραφή του "<b>"αποθηκευτικού χώρου USB"</b>" για να γίνει, επίσης, εκκαθάριση της μουσικής, των εικόνων και άλλων δεδομένων."</string>
-    <string name="master_clear_desc_erase_external_storage" product="default" msgid="4801026652617377093">\n\n"Πρέπει να γίνει εκκαθάριση της "<b>"κάρτας SD"</b>" για να γίνει, επίσης, εκκαθάριση της μουσικής, των εικόνων και άλλων δεδομένων."</string>
+    <string name="master_clear_desc_erase_external_storage" product="nosdcard" msgid="7744115866662613411">\n\n"Πρέπει να γίνει διαγραφή του "<b>"αποθηκευτικού χώρου USB"</b>" για να γίνει, επίσης, διαγραφή της μουσικής, των εικόνων και άλλων δεδομένων."</string>
+    <string name="master_clear_desc_erase_external_storage" product="default" msgid="4801026652617377093">\n\n"Πρέπει να γίνει διαγραφή της "<b>"κάρτας SD"</b>" για να γίνει, επίσης, διαγραφή της μουσικής, των εικόνων και άλλων δεδομένων."</string>
     <string name="erase_external_storage" product="nosdcard" msgid="969364037450286809">"Διαγρ. αποθ. χώρου USB"</string>
     <string name="erase_external_storage" product="default" msgid="1397239046334307625">"Διαγραφή κάρτας SD"</string>
     <string name="erase_external_storage_description" product="nosdcard" msgid="4728558173931599429">"Διαγράψτε όλα τα δεδομένα που υπάρχουν στον εσωτερικό αποθηκευτικό χώρο USB του τηλεφώνου σας, όπως αρχεία μουσικής και φωτογραφίες"</string>
@@ -1442,13 +1442,13 @@
     <string name="screen_compatibility_label" msgid="663250687205465394">"Συμβατότητα οθόνης"</string>
     <string name="permissions_label" msgid="2605296874922726203">"Άδειες"</string>
     <string name="cache_header_label" msgid="1877197634162461830">"Κρυφή μνήμη"</string>
-    <string name="clear_cache_btn_text" msgid="5756314834291116325">"Εκκαθάριση προσωρινής μνήμης"</string>
+    <string name="clear_cache_btn_text" msgid="5756314834291116325">"Διαγραφή προσωρινής μνήμης"</string>
     <string name="cache_size_label" msgid="7505481393108282913">"Κρυφή μνήμη"</string>
     <plurals name="uri_permissions_text" formatted="false" msgid="3983110543017963732">
       <item quantity="other">%d στοιχεία</item>
       <item quantity="one">1 στοιχείο</item>
     </plurals>
-    <string name="clear_uri_btn_text" msgid="8575655132961012158">"Εκκαθάριση πρόσβασης"</string>
+    <string name="clear_uri_btn_text" msgid="8575655132961012158">"Διαγραφή πρόσβασης"</string>
     <string name="controls_label" msgid="7611113077086853799">"Στοιχεία ελέγχου"</string>
     <string name="force_stop" msgid="7435006169872876756">"Αναγκαστική διακοπή"</string>
     <string name="total_size_label" msgid="1048676419552557254">"Σύνολο"</string>
@@ -1462,12 +1462,12 @@
     <string name="install_text" msgid="884360662922471113">"Εγκατάσταση"</string>
     <string name="disable_text" msgid="6544054052049395202">"Απενεργοποίηση"</string>
     <string name="enable_text" msgid="9217362512327828987">"Ενεργοποίηση"</string>
-    <string name="clear_user_data_text" msgid="5597622864770098388">"Εκκαθάριση δεδομένων"</string>
+    <string name="clear_user_data_text" msgid="5597622864770098388">"Διαγραφή δεδομένων"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Κατάργηση εγκατάστασης ενημερώσεων"</string>
     <string name="auto_launch_enable_text" msgid="4275746249511874845">"Έχετε επιλέξει να γίνεται εκκίνηση αυτής της εφαρμογής από προεπιλογή για ορισμένες ενέργειες."</string>
     <string name="always_allow_bind_appwidgets_text" msgid="566822577792032925">"Έχετε επιλέξει να επιτρέπεται σε αυτήν την εφαρμογή η δημιουργία γραφικών στοιχείων και η πρόσβαση στα δεδομένα τους."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Δεν έχουν οριστεί προεπιλογές."</string>
-    <string name="clear_activities" msgid="7408923511535174430">"Εκκαθάριση προεπιλογών"</string>
+    <string name="clear_activities" msgid="7408923511535174430">"Διαγραφή προεπιλογών"</string>
     <string name="screen_compatibility_text" msgid="1616155457673106022">"Αυτή η εφαρμογή ενδέχεται να μην έχει σχεδιαστεί για την οθόνη σας. Εδώ μπορείτε να ελέγξετε τον τρόπο προσαρμογής της στην οθόνη σας."</string>
     <string name="ask_compatibility" msgid="7225195569089607846">"Να ερωτώμαι κατά την εκκίνηση"</string>
     <string name="enable_compatibility" msgid="5806819252068617811">"Κλιμάκωση εφαρμογών"</string>
@@ -1505,8 +1505,8 @@
     <string name="app_not_found_dlg_title" msgid="3127123411738434964"></string>
     <string name="app_not_found_dlg_text" msgid="4893589904687340011">"Η εφαρμογή δεν βρέθηκε στη λίστα με τις εγκατεστημένες εφαρμογές."</string>
     <string name="clear_data_failed" msgid="7214074331627422248">"Δεν ήταν δυνατή η απαλοιφή των δεδομένων εφαρμογής."</string>
-    <string name="clear_failed_dlg_title" msgid="2387060805294783175">"Εκκαθάριση δεδομένων"</string>
-    <string name="clear_failed_dlg_text" msgid="5464475937929941008">"Δεν ήταν δυνατή η εκκαθάριση δεδομένων για την εφαρμογή."</string>
+    <string name="clear_failed_dlg_title" msgid="2387060805294783175">"Διαγραφή δεδομένων"</string>
+    <string name="clear_failed_dlg_text" msgid="5464475937929941008">"Δεν ήταν δυνατή η διαγραφή δεδομένων για την εφαρμογή."</string>
     <string name="security_settings_desc" product="tablet" msgid="1292421279262430109">"Αυτή η εφαρμογή μπορεί να αποκτήσει πρόσβαση στα ακόλουθα στο tablet σας:"</string>
     <string name="security_settings_desc" product="default" msgid="61749028818785244">"Αυτή η εφαρμογή μπορεί να αποκτήσει πρόσβαση στα ακόλουθα στο τηλέφωνό σας:"</string>
     <string name="security_settings_desc_multi" product="tablet" msgid="7300932212437084403">"Αυτή η εφαρμογή έχει τη δυνατότητα πρόσβασης στα παρακάτω στοιχεία στο tablet σας. Προκειμένου να βελτιωθεί η απόδοση και να περιοριστεί η χρήση μνήμης, ορισμένα από αυτά τα δικαιώματα είναι διαθέσιμα στην εφαρμογή <xliff:g id="BASE_APP_NAME">%1$s</xliff:g> καθώς εκτελείται με την ίδια διαδικασία με τις εφαρμογές <xliff:g id="ADDITIONAL_APPS_LIST">%2$s</xliff:g>:"</string>
@@ -2000,7 +2000,7 @@
     <string name="credentials_install" product="default" msgid="953914549998062317">"Εγκατάσταση από κάρτα SD"</string>
     <string name="credentials_install_summary" product="nosdcard" msgid="4220422806818210676">"Εγκατάσταση πιστοποιητικών από συσκευή αποθήκευσης"</string>
     <string name="credentials_install_summary" product="default" msgid="5737658257407822713">"Εγκατάσταση πιστοποιητικών από την κάρτα SD"</string>
-    <string name="credentials_reset" msgid="3239382277144980418">"Εκκαθάριση διαπιστευτηρίων"</string>
+    <string name="credentials_reset" msgid="3239382277144980418">"Διαγραφή διαπιστευτηρίων"</string>
     <string name="credentials_reset_summary" msgid="3369361230171260282">"Κατάργηση όλων των πιστοποιητικών"</string>
     <string name="trusted_credentials" msgid="4266945289534242402">"Αξιόπιστα διαπ/τήρια"</string>
     <string name="trusted_credentials_summary" msgid="6735221351155686632">"Προβολή αξιόπιστων πιστοποιητικών CA"</string>
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Αποσύνδεση"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Έκδοση <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Διαγραφή VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Αντικατάσταση υπάρχοντος VPN;"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Είστε ήδη συνδεδεμένοι σε ένα VPN. Εάν συνδεθείτε σε κάποιο άλλο, το υπάρχον VPN θα αντικατασταθεί."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Αντικατάσταση υπάρχοντος VPN;"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Ενεργοποίηση του μονίμως ενεργού VPN;"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Με την ενεργοποίηση αυτής της ρύθμισης, δεν θα έχετε σύνδεση στο διαδίκτυο μέχρι να συνδεθεί επιτυχώς το VPN"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Το υπάρχον VPN θα αντικατασταθεί και δεν θα έχετε σύνδεση στο διαδίκτυο μέχρι να συνδεθεί επιτυχώς το VPN"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Είστε ήδη συνδεδεμένοι σε ένα μονίμως ενεργό VPN. Εάν συνδεθείτε σε κάποιο άλλο, το υπάρχον VPN θα αντικατασταθεί και η λειτουργία μόνιμης ενεργοποίησης θα απενεργοποιηθεί."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Είστε ήδη συνδεδεμένοι σε κάποιο VPN. Εάν συνδεθείτε σε κάποιο άλλο, το υπάρχον VPN θα αντικατασταθεί."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Ενεργοποίηση"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Αδυναμία σύνδεσης <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Αυτή η εφαρμογή δεν υποστηρίζει μονίμως ενεργό VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Εμφάνιση %d κρυφού στοιχείου</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Δίκτυο και διαδίκτυο"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Συνδεδεμένες συσκευές"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Εφαρμογές και ειδοποιήσεις"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Χρήστης και λογαριασμοί"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Προεπιλογές εφαρμογής"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Γλώσσα: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Ρυθμίσεις"</string>
     <string name="search_menu" msgid="6283419262313758339">"Ρυθμίσεις αναζήτησης"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Ρυθμίσεις αναζήτησης"</string>
@@ -2549,7 +2557,7 @@
     <string name="keywords_text_to_speech_output" msgid="5150660047085754699">"αξιολόγηση, γλώσσα, προεπιλογή, μιλώ, ομιλία, tts, προσβασιμότητα, αναγνώστης οθόνης, τυφλός"</string>
     <string name="keywords_date_and_time" msgid="758325881602648204">"ρολόι, στρατιωτικό"</string>
     <string name="keywords_network_reset" msgid="6024276007080940820">"επαναφορά, επαναφορά, εργοστασιακές ρυθμίσεις"</string>
-    <string name="keywords_factory_data_reset" msgid="5894970373671252165">"σβήσιμο, διαγραφή, αποκατάσταση, εκκαθάριση, κατάργηση"</string>
+    <string name="keywords_factory_data_reset" msgid="5894970373671252165">"σβήσιμο, διαγραφή, αποκατάσταση, διαγραφή, κατάργηση"</string>
     <string name="keywords_printing" msgid="1701778563617114846">"εκτυπωτής"</string>
     <string name="keywords_sounds" msgid="7146245090127541167">"ηχητικό σήμα ομιλητή"</string>
     <string name="keywords_sounds_and_notifications_interruptions" msgid="5426093074031208917">"μην μην ενοχλείτε, διακόπτω, διακοπή, διάλειμμα"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Αντικατάσταση ήχων προφίλ εργασίας;"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Αντικατάσταση"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Οι τρέχοντες ήχοι του προφίλ εργασίας σας θα αντικατασταθούν με τους ήχους του προσωπικού προφίλ σας"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Διαμόρφωση ειδοποιήσεων"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Προτιμήσεις ειδοποιήσεων"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Σύνθετες ρυθμίσεις"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Ειδοποιήσεις εργασίας"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Φωτεινή ένδειξη ειδοπ."</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Τρίτη 6:01 μ.μ."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Τρίτη 6:02 μ.μ."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Τρίτη 6:03 μ.μ."</string>
-    <string name="see_all" msgid="8883901630052886984">"Εμφάνιση όλων"</string>
-    <string name="see_less" msgid="1250265310929558370">"Εμφάνιση λιγότερων"</string>
     <string name="disconnected" msgid="5787956818111197212">"Αποσυνδεδεμένο"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Χρησιμοποιήθηκε το <xliff:g id="AMOUNT">%1$s</xliff:g> των δεδομένων"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
@@ -3166,8 +3172,8 @@
     <string name="notification_log_details_ranking_null" msgid="244660392058720919">"Το αντικείμενο κατάταξης λείπει."</string>
     <string name="notification_log_details_ranking_none" msgid="599607025882587844">"Το αντικείμενο κατάταξης δεν περιέχει αυτό το κλειδί."</string>
     <string name="special_access" msgid="8275242424094109976">"Ειδική πρόσβαση"</string>
-    <string name="confirm_convert_to_fbe_warning" msgid="1487005506049137659">"Να γίνει όντως εκκαθάριση των δεδομένων χρήστη και μετατροπή σε κρυπτογράφηση αρχείου;"</string>
-    <string name="button_confirm_convert_fbe" msgid="7101855374850373091">"Εκκαθάριση και μετατροπή"</string>
+    <string name="confirm_convert_to_fbe_warning" msgid="1487005506049137659">"Να γίνει όντως διαγραφή των δεδομένων χρήστη και μετατροπή σε κρυπτογράφηση αρχείου;"</string>
+    <string name="button_confirm_convert_fbe" msgid="7101855374850373091">"Διαγραφή και μετατροπή"</string>
     <string name="reset_shortcut_manager_throttling" msgid="6495066467198668994">"Επαναφορά ορίου ρυθμού ShortcutManager"</string>
     <string name="reset_shortcut_manager_throttling_complete" msgid="1826770872063707900">"Έγινε επαναφορά του ορίου ρυθμού ShortcutManager"</string>
     <string name="notification_suggestion_title" msgid="4506524937307816475">"Έλεγχος ειδοποιήσεων κλειδώματος οθόνης"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index b96d10a..ba7f4fd 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Disconnect"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Forget VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Replace existing VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"You\'re already connected to a VPN. If you connect to a different one, your existing VPN will be replaced."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Replace existing VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Set always-on VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"By turning on this setting, you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Your existing VPN will be replaced and you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"You\'re already connected to an always-on VPN. If you connect to a different one, your existing VPN will be replaced and always-on mode will turn off."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"You\'re already connected to a VPN. If you connect to a different one, your existing VPN will be replaced."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Turn on"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> can\'t connect"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"This app doesn\'t support always-on VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Show %d hidden item</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Network &amp; Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Connected devices"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps &amp; notifications"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"User &amp; accounts"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"App defaults"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Language: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Settings"</string>
     <string name="search_menu" msgid="6283419262313758339">"Search Settings"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Search settings"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Replace work profile sounds?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Replace"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Your current work profile sounds will be replaced with your personal profile sounds"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configure notifications"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Notification preferences"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Advanced"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Work notifications"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulse notification light"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Tue 6:01 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Tue 6:02 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Tue 6:03 p.m."</string>
-    <string name="see_all" msgid="8883901630052886984">"See all"</string>
-    <string name="see_less" msgid="1250265310929558370">"See less"</string>
     <string name="disconnected" msgid="5787956818111197212">"Disconnected"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> of data used"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 568ab05..41b53b2 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Disconnect"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Forget VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Replace existing VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"You\'re already connected to a VPN. If you connect to a different one, your existing VPN will be replaced."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Replace existing VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Set always-on VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"By turning on this setting, you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Your existing VPN will be replaced and you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"You\'re already connected to an always-on VPN. If you connect to a different one, your existing VPN will be replaced and always-on mode will turn off."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"You\'re already connected to a VPN. If you connect to a different one, your existing VPN will be replaced."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Turn on"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> can\'t connect"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"This app doesn\'t support always-on VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Show %d hidden item</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Network &amp; Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Connected devices"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps &amp; notifications"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"User &amp; accounts"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"App defaults"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Language: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Settings"</string>
     <string name="search_menu" msgid="6283419262313758339">"Search Settings"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Search settings"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Replace work profile sounds?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Replace"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Your current work profile sounds will be replaced with your personal profile sounds"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configure notifications"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Notification preferences"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Advanced"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Work notifications"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulse notification light"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Tue 6:01 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Tue 6:02 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Tue 6:03 p.m."</string>
-    <string name="see_all" msgid="8883901630052886984">"See all"</string>
-    <string name="see_less" msgid="1250265310929558370">"See less"</string>
     <string name="disconnected" msgid="5787956818111197212">"Disconnected"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> of data used"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 568ab05..41b53b2 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Disconnect"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Forget VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Replace existing VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"You\'re already connected to a VPN. If you connect to a different one, your existing VPN will be replaced."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Replace existing VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Set always-on VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"By turning on this setting, you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Your existing VPN will be replaced and you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"You\'re already connected to an always-on VPN. If you connect to a different one, your existing VPN will be replaced and always-on mode will turn off."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"You\'re already connected to a VPN. If you connect to a different one, your existing VPN will be replaced."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Turn on"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> can\'t connect"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"This app doesn\'t support always-on VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Show %d hidden item</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Network &amp; Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Connected devices"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps &amp; notifications"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"User &amp; accounts"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"App defaults"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Language: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Settings"</string>
     <string name="search_menu" msgid="6283419262313758339">"Search Settings"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Search settings"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Replace work profile sounds?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Replace"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Your current work profile sounds will be replaced with your personal profile sounds"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configure notifications"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Notification preferences"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Advanced"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Work notifications"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulse notification light"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Tue 6:01 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Tue 6:02 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Tue 6:03 p.m."</string>
-    <string name="see_all" msgid="8883901630052886984">"See all"</string>
-    <string name="see_less" msgid="1250265310929558370">"See less"</string>
     <string name="disconnected" msgid="5787956818111197212">"Disconnected"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> of data used"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 667ec4c..e27b898 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desconectar"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versión <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Borrar VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"¿Reemplazar VPN existente?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Ya estás conectado a una VPN. Si te conectas a otra, se reemplazará la VPN actual."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"¿Reemplazar VPN existente?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"¿Configurar la VPN siempre activa?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Si activas esta configuración, no tendrás conexión a Internet hasta que la VPN se conecte correctamente"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Se reemplazará tu VPN actual y no tendrás conexión a Internet hasta que la VPN se conecte correctamente."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Ya estás conectado a una VPN siempre activa. Si te conectas a otra, se reemplazará la VPN actual y se desactivará el modo siempre activo."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Ya estás conectado a una VPN. Si te conectas a otra, se reemplazará la VPN actual."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activar"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"No se puede establecer conexión con <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Esta app no admite VPN siempre activada."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Mostrar %d elemento oculto</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Internet y red"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivos conectados"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps y notificaciones"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Usuario y cuentas"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Valores predeterminados de apps"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Configuración"</string>
     <string name="search_menu" msgid="6283419262313758339">"Configuración de búsqueda"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Configuración de búsqueda"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"¿Reemplazar sonidos de perfil?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Reemplazar"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Se reemplazarán los sonidos actuales de tu perfil de trabajo por los de tu perfil personal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurar las notificaciones"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferencias de notificaciones"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avanzada"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificaciones de trabajo"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Luz de notificación"</string>
@@ -3030,8 +3038,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Mar 6:01 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Mar 6:02 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Mar 6:03 p.m."</string>
-    <string name="see_all" msgid="8883901630052886984">"Ver todas"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ver menos"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desconectado"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de datos usados"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index a22c406..e510f2f 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -2278,8 +2278,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desconectar"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versión <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Borrar VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"¿Sustituir VPN actual?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Ya estás conectado a una red VPN. Si te conectas a otra, la VPN actual se sustituirá."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"¿Sustituir VPN actual?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"¿Configurar el modo de VPN siempre activada?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Si activas esta opción, no tendrás acceso a Internet hasta que se conecte la red VPN"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"La nueva red VPN sustituirá a la actual y no tendrás acceso a Internet hasta que dicha VPN se conecte"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Ya estás conectado a una red VPN siempre activada. Si te conectas a otra, esta sustituirá a la VPN actual y se desactivará el modo de VPN siempre activada."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Ya estás conectado a una red VPN. Si te conectas a otra, esta sustituirá a la VPN actual."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activar"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"No se puede conectar a <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Esta aplicación no admite una red VPN siempre activada."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2521,8 +2526,11 @@
       <item quantity="one">Mostrar %d elemento oculto</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Red e Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivos conectados"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplicaciones y notificaciones"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Cuentas de usuario"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Valores predeterminados de aplicaciones"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Ajustes"</string>
     <string name="search_menu" msgid="6283419262313758339">"Ajustes de búsqueda"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Ajustes de búsqueda"</string>
@@ -2624,7 +2632,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"¿Sustituir sonidos del perfil de trabajo?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Sustituir"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Se sustituirán los sonidos actuales del perfil de trabajo por los sonidos del perfil personal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurar notificaciones"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferencias de notificaciones"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Opciones avanzadas"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificaciones de trabajo"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Usar LED de notificaciones"</string>
@@ -3030,8 +3038,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Martes a las 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Martes a las 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Martes a las 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Ver todo"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ver menos"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desconectado"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de datos usados"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index a84c007..1c747dc 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Katkesta ühendus"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versioon <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Unusta VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Kas asendada olemasolev VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Teil juba on ühendus VPN-iga. Kui jätkate mõne teisega, asendatakse teie olemasolev VPN."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Kas asendada olemasolev VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Kas määrata alati sisselülitatud VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Kui selle seade sisse lülitate, pole teil Interneti-ühendust, kuni VPN-iga ühenduse loomine õnnestub"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Teie olemasolev VPN asendatakse ja teil pole Interneti-ühendust, kuni VPN-iga ühenduse loomine õnnestub"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Teil juba on ühendus alati sisselülitatud VPN-iga. Kui jätkate mõne teisega, asendatakse teie olemasolev VPN ja alati sisselülitatud režiim lülitatakse välja."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Teil juba on ühendus VPN-iga. Kui jätkate mõne teisega, asendatakse teie olemasolev VPN."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Lülita sisse"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ei saa ühendust luua"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"See rakendus ei toeta alati sisselülitatud VPN-i."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Kuva %d peidetud üksus</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Võrk ja Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Ühendatud seadmed"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Rakendused ja märguanded"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Kasutaja ja kontod"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Vaikerakendused"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Keel: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Seaded"</string>
     <string name="search_menu" msgid="6283419262313758339">"Otsingu seaded"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Otsinguseaded"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Kas asendada tööprofiili helid?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Asenda"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Teie praegused tööprofiili helid asendatakse isikliku profiili helidega"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Märguannete seadistamine"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Märguannete eelistused"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Täpsemad"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Töö märguanded"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Vilkuv märguande tuli"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Teisipäev, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Teisipäev, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Teisipäev, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Kuva kõik"</string>
-    <string name="see_less" msgid="1250265310929558370">"Kuva vähem"</string>
     <string name="disconnected" msgid="5787956818111197212">"Ühendus on katkestatud"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Kasutatud andmemaht on <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 3fd2ca4..43efc66 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Deskonektatu"</string>
     <string name="vpn_version" msgid="1939804054179766249">"<xliff:g id="VERSION">%s</xliff:g> bertsioa"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Ahaztu VPN konexioa"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Dagoen VPN konexioa ordeztu nahi duzu?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Bazaude VPN sare batera konektatuta. Beste batera konektatzen bazara, daukazuna ordeztuko da."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Dagoen VPN konexioa ordeztu nahi duzu?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"VPNa beti aktibatuta egoteko aukera ezarri nahi duzu?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ezarpen hau aktibatzen baduzu, ez duzu Interneteko konexiorik izango VPN sarera behar bezala konektatu arte"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Lehendik duzun VPNa ordeztuko da eta ez duzu Interneteko konexiorik izango VPN sarera behar bezala konektatu arte"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Beti aktibatuta dagoen VPN sare batera konektatuta zaude dagoeneko. Beste VPN batera konektatzen bazara, lehendik duzuna ordeztuko da eta desaktibatu egingo da beti aktibatuta edukitzeko modua."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Bazaude VPN sare batera konektatuta. Beste batera konektatzen bazara, daukazuna ordeztuko da."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktibatu"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Ezin da konektatu <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Aplikazio honek ez du onartzen beti aktibatuta dagoen VPN sarea."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Erakutsi %d elementu ezkutu</item>
       <item quantity="one">Erakutsi %d elementu ezkutu</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Sareak eta Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Konektatutako gailuak"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikazioak eta jakinarazpenak"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Erabiltzailea eta kontuak"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Aplikazio lehenetsiak"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Hizkuntza: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Ezarpenak"</string>
     <string name="search_menu" msgid="6283419262313758339">"Bilaketa-ezarpenak"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Bilaketa-ezarpenak"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Laneko profilaren soinua ordeztu?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Ordeztu"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Laneko profilaren soinuak profil pertsonaleko soinuekin ordeztuko dira"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfiguratu jakinarazpenak"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Ezarpen aurreratuak"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Laneko jakinarazpenak"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Jakinarazpen-argi keinukaria"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Asteartea, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Asteartea, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Asteartea, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Ikusi guztiak"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ikusi gutxiago"</string>
     <string name="disconnected" msgid="5787956818111197212">"Deskonektatuta"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Datuen <xliff:g id="AMOUNT">%1$s</xliff:g> erabili dira"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index e09b877..430cd31 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"قطع ارتباط"</string>
     <string name="vpn_version" msgid="1939804054179766249">"نسخه <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"‏فراموش کردن VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"‏VPN موجود جایگزین شود؟"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"‏درحال حاضر به VPN وصل هستید. اگر به VPN دیگری متصل شوید، VPN فعلی‌تان جایگزین می‌شود."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"‏VPN موجود جایگزین شود؟"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"‏VPN همیشه روشن تنظیم شود؟"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"‏با روشن کردن این تنظیم، تا وقتی VPN با موفقیت متصل نشود، اتصال اینترنت نخواهید داشت"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"‏VPN فعلی شما جایگزین می‌شود و تا وقتی VPN با موفقیت متصل نشود، اتصال اینترنت نخواهید داشت"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"‏درحال‌حاضر به VPN همیشه روشنی وصل هستید. اگر به VPN دیگری متصل شوید، VPN فعلی‌تان جایگزین می‌شود و حالت همیشه روشن خاموش می‌شود."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"‏درحال حاضر به VPN وصل هستید. اگر به VPN دیگری متصل شوید، VPN فعلی‌تان جایگزین می‌شود."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"فعال کردن"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> نمی‌تواند متصل شود"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"‏این برنامه از VPN همیشه روشن پشتیبانی نمی‌کند."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">‏نمایش %d مورد پنهان</item>
       <item quantity="other">‏نمایش %d مورد پنهان</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"شبکه و اینترنت"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"دستگاه‌های متصل"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"برنامه‌ها و اعلان‌ها"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"حساب‌های کاربر"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"پیش‌فرض‌های برنامه"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"زبان: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"تنظیمات"</string>
     <string name="search_menu" msgid="6283419262313758339">"تنظیمات جستجو"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"تنظیمات جستجو"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"صداهای نمایه کاری‌تان جایگزین شوند؟"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"جایگزینی"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"صداهای نمایه کاری کنونی‌تان با صداهای نمایه شخصی‌تان جایگزین می‌شوند"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"پیکربندی اعلان‌ها"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"پیشرفته"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"اعلان‌های کار"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"چراغ اعلان چشمک بزند"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"سه‌شنبه ۶:۰۱ ب.ظ"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"سه‌شنبه ۶:۰۲ ب.ظ"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"سه‌شنبه ۶:۰۳ ب.ظ"</string>
-    <string name="see_all" msgid="8883901630052886984">"مشاهده همه"</string>
-    <string name="see_less" msgid="1250265310929558370">"مشاهده موارد کمتر"</string>
     <string name="disconnected" msgid="5787956818111197212">"قطع ارتباط"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> داده استفاده‌شده"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 6581bf0..b997344 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Katkaise yhteys"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versio <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Unohda VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Korvataanko nykyinen VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Olet jo yhteydessä VPN-verkkoon. Jos muodostat yhteyden uuteen VPN:ään, nykyinen verkkosi korvataan."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Korvataanko nykyinen VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Määritetäänkö aina käytössä oleva VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Jos otat tämän asetuksen käyttöön, et voi muodostaa internetyhteyttä ennen kuin VPN-yhteys on muodostettu."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Nykyinen VPN korvataan, etkä voi muodostaa internetyhteyttä ennen kuin VPN-yhteys on muodostettu."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Olet jo yhteydessä aina käytössä olevaan VPN-verkkoon. Jos muodostat yhteyden uuteen VPN:ään, nykyinen verkkosi korvataan ja aina käytössä ‑tila poistetaan käytöstä."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Olet jo yhteydessä VPN-verkkoon. Jos muodostat yhteyden uuteen VPN:ään, nykyinen verkkosi korvataan."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Ota käyttöön"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Yhteyttä verkkoon <xliff:g id="VPN_NAME">%1$s</xliff:g> ei voi muodostaa"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Sovellus ei tue aina käytössä olevaa VPN-yhteyttä."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Näytä %d piilotettu kohde</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Verkko ja internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Yhdistetyt laitteet"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Sovellukset ja ilmoitukset"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Käyttäjä ja tilit"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Oletussovellukset"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Kieli: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Asetukset"</string>
     <string name="search_menu" msgid="6283419262313758339">"Hakuasetukset"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Hakuasetukset"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Korvataanko työprofiiliäänet?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Korvaa"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Työprofiilin nykyiset äänet korvataan henkilökohtaisen profiilin äänillä."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Ilmoitusten määrittäminen"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Lisäasetukset"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Työilmoitukset"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Vilkuta ilmoitusvaloa"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Ti klo 18.01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Ti klo 18.02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Ti klo 18.03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Näytä kaikki"</string>
-    <string name="see_less" msgid="1250265310929558370">"Näytä vähemmän"</string>
     <string name="disconnected" msgid="5787956818111197212">"Yhteys katkaistu"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> datasta käytetty"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index bb15810..413f659 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -599,7 +599,7 @@
     <string name="bluetooth_device_context_connect_advanced" msgid="2643129703569788771">"Options…"</string>
     <string name="bluetooth_menu_advanced" msgid="8572178316357220524">"Options avancées"</string>
     <string name="bluetooth_advanced_titlebar" msgid="2142159726881547669">"Paramètres Bluetooth avancés"</string>
-    <string name="bluetooth_empty_list_bluetooth_off" msgid="6351930724051893423">"Si Bluetooth activé, appareil peut communiquer avec autres appareils Bluetooth à proximité."</string>
+    <string name="bluetooth_empty_list_bluetooth_off" msgid="6351930724051893423">"Si la fonctionnalité Bluetooth est activée, l\'appareil peut communiquer avec les autres appareils Bluetooth à proximité"</string>
     <string name="ble_scan_notify_text" msgid="1295915006005700650">"Pour améliorer la précision de la localisation, les applications et les services système peuvent toujours détecter les appareils Bluetooth. Vous pouvez modifier ce paramètre dans les <xliff:g id="LINK_BEGIN_0">LINK_BEGIN</xliff:g>paramètres de recherche<xliff:g id="LINK_END_1">LINK_END</xliff:g>."</string>
     <string name="bluetooth_connect_specific_profiles_title" msgid="6952214406025825164">"Se connecter à…"</string>
     <string name="bluetooth_disconnect_a2dp_profile" msgid="3524648279150937177">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> sera déconnecté de l\'audio du support."</string>
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Déconnecter"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Oublier le profil RPV"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Remplacer le RPV existant?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Vous êtes déjà connecté à un RPV. Si vous vous connectez à un RPV différent, votre RPV actuel sera remplacé."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Remplacer le RPV existant?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Définir le RPV permanent?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Si vous activez ce paramètre, vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le RPV parvienne à se connecter"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Votre RPV existant sera remplacé, et vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le RPV parvienne à se connecter"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Vous êtes déjà connecté à un RPV permanent. Si vous vous connectez à un autre RPV, le RPV actuel sera remplacé et le mode permanent sera désactivé."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Vous êtes déjà connecté à un RPV. Si vous vous connectez à un RPV différent, votre RPV actuel sera remplacé."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activer"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> n\'est pas en mesure de se connecter"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Cette application ne prend pas en charge le RPV permanent."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">Afficher %d élément masqué</item>
       <item quantity="other">Afficher %d éléments masqués</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Réseau et Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Appareils connectés"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Applications et notifications"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Utilisateurs et comptes"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Valeurs par défaut de l\'application"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Langue : <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Paramètres"</string>
     <string name="search_menu" msgid="6283419262313758339">"Paramètres de recherche"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Paramètres de recherche"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Remplacer sons du profil prof.?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Remplacer"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Les sons actuels de votre profil professionnel seront remplacés par ceux de votre profil personnel."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurer les notifications"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Paramètres avancés"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notifications professionnelles"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Voyant de notification"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Mardi à 18 h 01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Mardi à 18 h 02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Mardi à 18 h 03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Tout afficher"</string>
-    <string name="see_less" msgid="1250265310929558370">"En voir moins"</string>
     <string name="disconnected" msgid="5787956818111197212">"Déconnecté"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de données utilisées"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
@@ -3198,7 +3204,7 @@
     <string name="support_escalation_by_phone" msgid="4843223043487058711">"Téléphone"</string>
     <string name="support_escalation_by_chat" msgid="977019859110763749">"Clavardage"</string>
     <string name="support_tips_and_tricks_title" msgid="4153466795695447828">"Découvrir des conseils et des astuces"</string>
-    <string name="support_help_feedback_title" msgid="693440287222186718">"Rechercher dans l\'aide et envoyer commentaires"</string>
+    <string name="support_help_feedback_title" msgid="693440287222186718">"Rechercher dans l\'aide et envoyer des commentaires"</string>
     <string name="support_sign_in_required_title" msgid="1367187789121480440">"Communiquer avec l\'équipe d\'assistance"</string>
     <string name="support_sign_in_button_text" msgid="3054769428620671241">"Connexion"</string>
     <string name="support_sign_in_required_help" msgid="5200654782405538114">"Vous n\'arrivez pas à vous connecter?"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 803d247..e397e67 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Déconnecter"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Supprimer le VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Remplacer le VPN existant ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Vous êtes déjà connecté à un VPN. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Remplacer le VPN existant ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Définir le VPN permanent ?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Si vous activez ce paramètre, vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le VPN parvienne à se connecter"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Votre VPN existant sera remplacé, et vous ne disposerez d\'aucune connexion Internet jusqu\'à ce que le VPN parvienne à se connecter"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Vous êtes déjà connecté à un VPN permanent. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé et le mode permanent sera désactivé."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Vous êtes déjà connecté à un VPN. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activer"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ne peut pas se connecter"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Cette application n\'est pas compatible avec le VPN permanent."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">Afficher %d élément masqué</item>
       <item quantity="other">Afficher %d éléments masqués</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Réseau et Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Appareils connectés"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Applications et notifications"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Utilisateur et comptes"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Valeurs par défaut de l\'application"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Langue : <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Paramètres"</string>
     <string name="search_menu" msgid="6283419262313758339">"Paramètres de recherche"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Paramètres de recherche"</string>
@@ -2627,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Remplacer sons du profil pro ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Remplacer"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Les sons actuels de votre profil professionnel seront remplacés par ceux de votre profil personnel."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurer les notifications"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Préférences de notification"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Paramètres avancés"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notifications profil pro"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Voyant de notification"</string>
@@ -3033,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Mardi à 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Mardi à 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Mardi à 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Tout afficher"</string>
-    <string name="see_less" msgid="1250265310929558370">"Moins de détails"</string>
     <string name="disconnected" msgid="5787956818111197212">"Déconnecté"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> des données sont utilisées."</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
@@ -3198,7 +3203,7 @@
     <string name="support_escalation_by_phone" msgid="4843223043487058711">"Téléphone"</string>
     <string name="support_escalation_by_chat" msgid="977019859110763749">"Chat"</string>
     <string name="support_tips_and_tricks_title" msgid="4153466795695447828">"Parcourir les conseils et les astuces"</string>
-    <string name="support_help_feedback_title" msgid="693440287222186718">"Rechercher dans l\'aide ou envoyer comment."</string>
+    <string name="support_help_feedback_title" msgid="693440287222186718">"Rechercher dans l\'aide et envoyer des commentaires"</string>
     <string name="support_sign_in_required_title" msgid="1367187789121480440">"Contacter le service d\'assistance"</string>
     <string name="support_sign_in_button_text" msgid="3054769428620671241">"Connexion"</string>
     <string name="support_sign_in_required_help" msgid="5200654782405538114">"Vous ne pouvez pas vous connecter ?"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 89e2b6f..bc2d010 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desconectar"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versión <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Esquecer perfil da VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Queres substituír a VPN existente?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Xa te conectaches a unha VPN. Se te conectas a unha distinta, substituirase a VPN actual."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Queres substituír a VPN existente?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Queres definir a VPN como sempre activa?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ao activar esta configuración, non terás conexión a Internet ata que se conecte a VPN correctamente"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"A VPN existente substituirase e non terás conexión a Internet ata que se conecte á VPN correctamente"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Xa te conectaches a unha VPN sempre activa. Se te conectas a unha VPN distinta, substituirase a actual e desactivarase o modo de VPN sempre activa."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Xa te conectaches a unha VPN. Se te conectas a unha distinta, substituirase a VPN actual."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activar"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Non se pode conectar a <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Esta aplicación non é compatible con VPN que estean sempre activadas."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Mostrar %d elemento oculto</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Rede e Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivos conectados"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplicacións e notificacións"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Usuario e contas"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Valores predeterminados das aplicacións"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Configuración"</string>
     <string name="search_menu" msgid="6283419262313758339">"Configuración de busca"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Configuración de busca"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Substit. sons perfil traballo?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Substituír"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Os sons actuais do perfil do traballo substituiranse cos sons do teu perfil persoal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurar notificacións"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferencias de notificacións"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avanzada"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificacións do traballo"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Luz de notificación"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Martes ás 6:01 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Martes ás 6:02 p.m."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Martes ás 6:03 p.m."</string>
-    <string name="see_all" msgid="8883901630052886984">"Ver todo"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ver menos"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desconectada"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de datos utilizados"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index 2180f08..5e8021c 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -879,12 +879,12 @@
     <string name="musicfx_title" msgid="3415566786340790345">"સંગીત પ્રભાવો"</string>
     <string name="ring_volume_title" msgid="5592466070832128777">"રિંગ વૉલ્યુમ"</string>
     <string name="vibrate_in_silent_title" msgid="3897968069156767036">"શાંત હોય ત્યારે વાઇબ્રેટ કરો"</string>
-    <string name="notification_sound_title" msgid="5137483249425507572">"ડિફોલ્ટ સૂચના ધ્વનિ"</string>
+    <string name="notification_sound_title" msgid="5137483249425507572">"ડિફોલ્ટ સૂચના માટે ધ્વનિ"</string>
     <string name="incoming_call_volume_title" msgid="8073714801365904099">"રિંગટોન"</string>
     <string name="notification_volume_title" msgid="2012640760341080408">"સૂચના"</string>
     <string name="checkbox_notification_same_as_incoming_call" msgid="1073644356290338921">"સૂચનાઓ માટે ઇનકમિંગ કૉલ વોલ્યુમનો ઉપયોગ કરો"</string>
     <string name="home_work_profile_not_supported" msgid="7457951997970419085">"કાર્ય પ્રોફાઇલ્સનું સમર્થન કરતું નથી"</string>
-    <string name="notification_sound_dialog_title" msgid="3805140135741385667">"ડિફોલ્ટ સૂચના ધ્વનિ"</string>
+    <string name="notification_sound_dialog_title" msgid="3805140135741385667">"ડિફોલ્ટ સૂચના માટે ધ્વનિ"</string>
     <string name="media_volume_title" msgid="3576565767317118106">"મીડિયા"</string>
     <string name="media_volume_summary" msgid="5363248930648849974">"સંગીત અને વિડિઓ માટે વોલ્યૂમ સેટ કરો"</string>
     <string name="alarm_volume_title" msgid="2285597478377758706">"એલાર્મ"</string>
@@ -2282,8 +2282,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ડિસ્કનેક્ટ કરો"</string>
     <string name="vpn_version" msgid="1939804054179766249">"સંસ્કરણ <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN ભૂલી ગયાં"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"અસ્તિત્વમાંની VPN ને બદલીએ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"તમે પહેલાંથી VPN થી કનેક્ટ થયેલ છો. જો તમે કોઈ બીજાથી કનેક્ટ કરો છો, તો તમારા અસ્તિત્વમાંના VPN ને બદલવામાં આવશે."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"અસ્તિત્વમાંની VPN ને બદલીએ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"હંમેશાં ચાલુ VPN સેટ કરીએ?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"આ સેટિંગ ચાલુ કરવાથી, જ્યાં સુધી VPN સફળતાપૂર્વક કનેક્ટ ન થાય ત્યાં સુધી તમારી પાસે ઇન્ટરનેટ કનેક્શન હશે નહીં"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"તમારા અસ્તિત્વમાંના VPN ને બદલવામાં આવશે અને VPN સફળતાપૂર્વક કનેક્ટ ન થાય ત્યાં સુધી તમારી પાસે ઇન્ટરનેટ કનેક્શન હશે નહીં"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"તમે પહેલાંથી હંમેશાં-ચાલુ VPN થી કનેક્ટ થયેલ છો. જો તમે કોઈ બીજાથી કનેક્ટ કરો છો, તો તમારા અસ્તિત્વમાંના VPN ને બદલવામાં આવશે અને હંમેશાં-ચાલુ મોડ બંધ થઈ જશે."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"તમે પહેલાંથી VPN થી કનેક્ટ થયેલ છો. જો તમે કોઈ બીજાથી કનેક્ટ કરો છો, તો તમારા અસ્તિત્વમાંના VPN ને બદલવામાં આવશે."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ચાલુ કરો"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> થી કનેક્ટ કરી શકાતું નથી"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"આ ઍપ્લિકેશન હંમેશાં ચાલુ VPN નું સમર્થન કરતી નથી."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2524,10 +2529,12 @@
       <item quantity="one">%d છુપાયેલ આઇટમ બતાવો</item>
       <item quantity="other">%d છુપાયેલ આઇટમ બતાવો</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"નેટવર્ક અને ઇન્ટરનેટ"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"કનેક્ટ થયેલ ઉપકરણો"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ઍપ્લિકેશનો અને સૂચનાઓ"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"વપરાશકર્તા અને એકાઉન્ટ્સ"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ઍપ્લિકેશન ડિફૉલ્ટ્સ"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ભાષા: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"સેટિંગ્સ"</string>
     <string name="search_menu" msgid="6283419262313758339">"શોધ સેટિંગ્સ"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"શોધ સેટિંગ્સ"</string>
@@ -2629,7 +2636,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"કાર્ય પ્રોફાઇલ ધ્વનિઓ બદલીએ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"બદલો"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"તમારી વર્તમાન કાર્ય પ્રોફાઇલ ધ્વનિઓ તમારી વ્યક્તિગત પ્રોફાઇલ ધ્વનિઓ સાથે બદલવામાં આવશે"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"સૂચનાઓ ગોઠવો"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"વિગતવાર"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"કાર્યની સૂચનાઓ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"પલ્સ સૂચના પ્રકાશ"</string>
@@ -3035,8 +3043,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"મંગળ 6:01 સાંજે"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"મંગળ 6:02 સાંજે"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"મંગળ 6:03 સાંજે"</string>
-    <string name="see_all" msgid="8883901630052886984">"બધું જુઓ"</string>
-    <string name="see_less" msgid="1250265310929558370">"ઓછું જુઓ"</string>
     <string name="disconnected" msgid="5787956818111197212">"ડિસ્કનેક્ટ કર્યું"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ડેટા વાપર્યો"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3263c4b..e5b2789 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"डिस्कनेक्ट करें"</string>
     <string name="vpn_version" msgid="1939804054179766249">"वर्शन <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN भूल जाएं"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"मौजूदा VPN को बदलें?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"आप पहले से ही किसी VPN से कनेक्ट हैं. यदि आप किसी दूसरे से कनेक्ट करते हैं, तो आपका माैजूदा VPN बदल दिया जाएगा."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"मौजूदा VPN को बदलें?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"हमेशा-चालू VPN सेट करें?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"यह सेटिंग चालू करने से, आपके पास तब तक इंटरनेट कनेक्शन नहीं होगा जब तक कि VPN सफलतापूर्वक कनेक्ट नहीं हो जाता"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"आपका मौजूदा VPN बदल दिया जाएगा और आपके पास तब तक इंटरनेट कनेक्शन नहीं होगा जब तक कि VPN सफलतापूर्वक कनेक्ट नहीं हो जाता"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"आप हमेशा चालू रहने वाले किसी VPN से पहले से कनेक्ट हैं. यदि आप किसी दूसरे से कनेक्ट करते हैं तो मौजूदा VPN बदल दिया जाएगा और हमेशा-चालू मोड बंद हो जाएगा."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"आप पहले से ही किसी VPN से कनेक्ट हैं. यदि आप किसी दूसरे से कनेक्ट करते हैं, तो आपका माैजूदा VPN बदल दिया जाएगा."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"चालू करें"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> कनेक्ट नहीं कर सकता"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"यह ऐप्लिकेशन हमेशा-चालू VPN का समर्थन नहीं करता."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="other">छिपे हुए %d आइटम दिखाएं</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"नेटवर्क और इंटरनेट"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"कनेक्ट किए गए डिवाइस"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ऐप्लिकेशन और नोटिफ़िकेशन"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"उपयोगकर्ता और खाते"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ऐप्लिकेशन डिफ़ॉल्ट"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"भाषा: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"सेटिंग"</string>
     <string name="search_menu" msgid="6283419262313758339">"खोज सेटिंग"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"खोज सेटिंग"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"कार्य प्रोफाइल ध्वनियां बदलें?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"बदलें"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"आपकी वर्तमान कार्य प्रोफ़ाइल की ध्वनियां आपकी व्यक्तिगत प्रोफ़ाइल की ध्वनियों से बदल दी जाएंगी"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"नोटिफिकेशन कॉन्फ़िगर किए गए"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"उन्नत"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"कार्य नोटिफ़िकेशन"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"पल्‍स नोटिफिकेशन लाइट"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"मंगलवार शाम 6:01 बजे"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"मंगलवार शाम 6:02 बजे"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"मंगलवार शाम 6:03 बजे"</string>
-    <string name="see_all" msgid="8883901630052886984">"सभी देखें"</string>
-    <string name="see_less" msgid="1250265310929558370">"कम देखें"</string>
     <string name="disconnected" msgid="5787956818111197212">"डिस्कनेक्ट किया गया"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> डेटा का उपयोग किया गया है"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 00f3d46..a199500 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -2297,8 +2297,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Prekini vezu"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Verzija <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Zaboravi VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Želite li zamijeniti dosadašnji VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Već ste povezani s VPN-om. Ako se povežete s nekim drugi VPN-om, on će zamijeniti dosadašnji."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Želite li zamijeniti dosadašnji VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Želite li postaviti uvijek uključeni VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ako uključite tu postavku, nećete imati internetsku vezu dok se VPN ne poveže"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Vaš dosadašnji VPN zamijenit će se i nećete imati internetsku vezu dok se VPN ne poveže"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Već ste povezani s uvijek uključenim VPN-om. Ako se povežete s nekim drugim VPN-om, on će zamijeniti dosadašnji, a način rada \"uvijek uključeno\" isključit će se."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Već ste povezani s VPN-om. Ako se povežete s nekim drugi VPN-om, on će zamijeniti dosadašnji."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Uključi"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Povezivanje s <xliff:g id="VPN_NAME">%1$s</xliff:g> mrežom nije uspjelo"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ova aplikacija ne podržava uvijek uključeni VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2545,8 +2550,11 @@
       <item quantity="other">Prikaži %d skrivenih stavki</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Mreža i internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Povezani uređaji"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikacije i obavijesti"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Korisnik i postavke"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Zadane aplikacije"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Postavke"</string>
     <string name="search_menu" msgid="6283419262313758339">"Postavke pretraživanja"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Postavke pretraživanja"</string>
@@ -2648,7 +2656,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Zamjena zvuka radnog profila?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Zamijeni"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Trenutačni zvukovi radnog profila zamijenit će se zvukovima osobnog profila"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfiguriranje obavijesti"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Napredno"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Obavijesti s radnog profila"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsno svjetlo obavijesti"</string>
@@ -3062,8 +3071,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Uto, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Uto, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Uto, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Prikaži sve"</string>
-    <string name="see_less" msgid="1250265310929558370">"Prikaži manje"</string>
     <string name="disconnected" msgid="5787956818111197212">"Veza je prekinuta"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Količina iskorištenih podataka: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 8001a1b..5ae84d6 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Leválasztás"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Verzió: <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN elfelejtése"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Lecseréli a meglévő VPN-t?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Már csatlakozott egy VPN-hez. Ha másikhoz csatlakozik, a meglévő VPN-t lecseréljük."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Lecseréli a meglévő VPN-t?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Beállítja a mindig bekapcsolt VPN-t?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"A beállítás bekapcsolása után a VPN sikeres csatlakozásáig nem lesz internetkapcsolata"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"A rendszer lecseréli meglévő VPN-jét, valamint az új VPN csatlakozásáig nem lesz internetkapcsolata."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Már csatlakozik egy mindig bekapcsolt VPN-hez. Ha másik VPN-re csatlakozik, akkor a rendszer lecseréli a meglévőt, valamint kikapcsolja a mindig bekapcsolt módot."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Már csatlakozik VPN-hez. Ha másikhoz csatlakozik, a meglévő VPN-t lecseréljük."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Bekapcsolás"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"A(z) <xliff:g id="VPN_NAME">%1$s</xliff:g> nem tud csatlakozni"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ez az alkalmazás nem támogatja a mindig bekapcsolt VPN-t."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">%d rejtett elem megjelenítése</item>
       <item quantity="one">%d rejtett elem megjelenítése</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Hálózat és internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Társított eszközök"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Alkalmazások és értesítések"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Felhasználó és fiókok"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Alapértelmezett alkalmazások"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Nyelv: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Beállítások"</string>
     <string name="search_menu" msgid="6283419262313758339">"Keresési beállítások"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Keresési beállítások"</string>
@@ -2627,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Lecseréli a munkaprofil hangbeállításait?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Csere"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"A munkaprofil jelenlegi hangbeállításait lecseréljük a személyes profilban lévőkkel"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Értesítések beállítása"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Értesítési beállítások"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Speciális"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Munkahelyi profil értesítései"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Villogó értesítő fény"</string>
@@ -3033,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Kedd 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Kedd 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Kedd 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Az összes megjelenítése"</string>
-    <string name="see_less" msgid="1250265310929558370">"Kevesebb megjelenítése"</string>
     <string name="disconnected" msgid="5787956818111197212">"Kapcsolat bontva"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Felhasznált adatmennyiség: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index a594196..60578ff 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -705,8 +705,8 @@
     <string name="wifi_more" msgid="3195296805089107950">"Ավելին"</string>
     <string name="wifi_setup_wps" msgid="8128702488486283957">"Ինքնուրույն կարգավորում (WPS)"</string>
     <string name="wifi_show_advanced" msgid="3409422789616520979">"Ընդլայնված ընտրանքներ"</string>
-    <string name="wifi_advanced_toggle_description_expanded" msgid="2380600578544493084">"Ընդլայնված ընտրանքների բացվող ցանկ: Կրկնակի հպեք՝ կոծկելու համար:"</string>
-    <string name="wifi_advanced_toggle_description_collapsed" msgid="1463812308429197263">"Ընդլայնված ընտրանքների բացվող ցանկ: Կրկնակի հպեք՝ ընդարձակելու համար:"</string>
+    <string name="wifi_advanced_toggle_description_expanded" msgid="2380600578544493084">"Ընդլայնված ընտրանքների իջնող ցանկ: Կրկնակի հպեք՝ կոծկելու համար:"</string>
+    <string name="wifi_advanced_toggle_description_collapsed" msgid="1463812308429197263">"Ընդլայնված ընտրանքների իջնող ցանկ: Կրկնակի հպեք՝ ընդարձակելու համար:"</string>
     <string name="wifi_wps_setup_title" msgid="8207552222481570175">"Wi‑Fi-ով պաշտպանված կարգավորում"</string>
     <string name="wifi_wps_setup_msg" msgid="315174329121275092">"WPS-ը մեկնարկում է..."</string>
     <string name="wifi_wps_onstart_pbc" msgid="817003360936932340">"Սեղմեք երթուղիչի «անվտանգ Wi‑Fi կարգավորում» կոճակը: Այն կարող է կոչվել «WPS» կամ նշված լինել այս նշանով՝"</string>
@@ -2026,7 +2026,7 @@
     <string name="credentials_enabled" msgid="7588607413349978930">"Վկայականի պահոցը միացված է:"</string>
     <string name="credentials_configure_lock_screen_hint" msgid="6757119179588664966">"Վկայականների պահոցն օգտագործելու համար անհրաժեշտ է, որ էկրանը կողպող PIN կամ գաղտնաբառ կիրառեք:"</string>
     <string name="usage_access_title" msgid="332333405495457839">"Թույլատրված հավելվածներ"</string>
-    <string name="emergency_tone_title" msgid="1055954530111587114">"Արտակարգ իրավիճակ ահազանգող ազդանշան"</string>
+    <string name="emergency_tone_title" msgid="1055954530111587114">"Շտապ կանչի ազդանշանը"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Կարգավորել աշխատանքի ռեժիմը շտապ կանչի դեպքում"</string>
     <string name="privacy_settings" msgid="5446972770562918934">"Պահուստավորում և վերակայում"</string>
     <string name="privacy_settings_title" msgid="4856282165773594890">"Պահուստավորում և վերականգնում"</string>
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Անջատել"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Տարբերակ <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Մոռանալ VPN-ը"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Փոխարինե՞լ ընթացիկ VPN-ը:"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Դուք արդեն միացած եք VPN ցանցին: Մեկ այլ ցանցին միանալու դեպքում, ընթացիկ VPN-ը կփոխարինվի նորով:"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Փոխարինե՞լ ընթացիկ VPN-ը:"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Սահմանե՞լ որպես «միշտ միացված» VPN:"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Այս կարգավորումը միացնելու դեպքում դուք մինչև VPN-ի բարեհաջող միացումը ինտերնետ կապ չեք ունենա"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Ձեր ընթացիկ VPN-ը կփոխարինվի նորով և դուք մինչև VPN-ի բարեհաջող միացումը ինտերնետ կապ չեք ունենա"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Դուք արդեն միացած եք «միշտ միացված» VPN ցանցին: Մեկ այլ VPN ցանցին միանալու դեպքում ընթացիկ VPN-ը կփոխարինվի նորով և «միշտ միացված» ռեժիմը կանջատվի:"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Դուք արդեն միացած եք VPN ցանցին: Մեկ այլ ցանցին միանալու դեպքում ընթացիկ VPN-ը կփոխարինվի նորով:"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Միացնել"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Հնարավոր չէ միանալ <xliff:g id="VPN_NAME">%1$s</xliff:g> ցանցին"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Այս հավելվածը չի աջակցում VPN-ի միշտ միացված ռեժիմը:"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="other">Ցույց տալ %d թաքնված տարրեր</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Ցանց և ինտերնետ"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Կապակցված սարքեր"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Հավելվածներ և ծանուցումներ"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Օգտվող և հաշիվներ"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Հավելվածի կանխադրված կարգավորումներ"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Լեզուն՝ <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Կարգավորումներ"</string>
     <string name="search_menu" msgid="6283419262313758339">"Որոնման կարգավորումներ"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Որոնման կարգավորումներ"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Փոխարինե՞լ աշխատանքային պրոֆիլի ձայները:"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Փոխարինել"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Աշխատանքային պրոֆիլի ընթացիկ ձայները կփոխարինվեն անձնական հաշվի ձայներով"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Ծանուցումների կազմաձևում"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Լրացուցիչ"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Աշխատանքային ծանուցումներ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Ծանուցման լույսի թարթում"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Երք, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Երք, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Երք, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Տեսնել բոլորը"</string>
-    <string name="see_less" msgid="1250265310929558370">"Տեսնել ավելի քիչ"</string>
     <string name="disconnected" msgid="5787956818111197212">"Անջատված է"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Օգտագործած տվյալներ՝ <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index f39d1ca..c464ebc 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Putuskan sambungan"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versi <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Lupakan VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Ganti VPN yang sudah ada?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Anda sudah terhubung ke VPN. Jika Anda terhubung ke VPN yang berbeda, VPN yang ada akan digantikan."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Ganti VPN yang sudah ada?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Setel VPN selalu aktif?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Jika setelan ini diaktifkan, sambungan internet akan tersedia jika VPN berhasil terhubung"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"VPN yang sudah ada akan digantikan, dan sambungan internet akan tersedia jika VPN berhasil terhubung"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Anda sudah terhubung ke VPN selalu aktif. Jika Anda terhubung ke VPN yang berbeda, VPN yang sudah ada akan digantikan, dan mode selalu aktif akan dinonaktifkan."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Anda sudah terhubung ke VPN. Jika Anda terhubung ke VPN yang berbeda, VPN yang sudah ada akan digantikan."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktifkan"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> tidak dapat terhubung"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Aplikasi ini tidak mendukung VPN yang selalu aktif."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Tampilkan %d item tersembunyi</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Jaringan &amp; Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Perangkat yang terhubung"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikasi &amp; notifikasi"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Pengguna &amp; akun"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Aplikasi default"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Bahasa: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Setelan"</string>
     <string name="search_menu" msgid="6283419262313758339">"Setelan penelusuran"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Setelan penelusuran"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Ganti suara profil kerja?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Ganti"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Suara profil kerja saat ini akan diganti dengan suara profil pribadi"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurasikan notifikasi"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferensi notifikasi"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Lanjutan"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notifikasi kerja"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Kedipkan lampu notifikasi"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Sel 18.01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Sel 18.02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Sel 18.03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Lihat semua"</string>
-    <string name="see_less" msgid="1250265310929558370">"Lihat lebih sedikit"</string>
     <string name="disconnected" msgid="5787956818111197212">"Terputus"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> data digunakan"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index c053fce..c7b0b11 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Aftengja"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Útgáfa <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Gleyma VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Skipta út núverandi VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Þú ert nú þegar með VPN tengt. Ef þú tengist öðru neti kemur það í stað fyrirliggjandi VPN."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Skipta út núverandi VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Velja VPN sem alltaf er kveikt á?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ef þú kveikir á þessari stillingu nærðu ekki nettengingu fyrr en VPN nær að tengjast"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Núverandi VPN verður skipt út og engin nettenging verður fyrir hendi fyrr en VPN nær að tengjast"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Þú ert þegar með tengingu við VPN sem alltaf er kveikt á. Ef þú tengist við annað net verður fyrirliggjandi VPN skipt út og slökkt verður á stillingunni „Alltaf kveikt“."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Þú ert nú þegar með VPN tengt. Ef þú tengist öðru neti kemur það í stað fyrirliggjandi VPN."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Kveikja"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> getur ekki tengst"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Þetta forrit styður ekki sívirkt VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="other">Sýna %d falin atriði</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Netkerfi og internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Tengd tæki"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Forrit og tilkynningar"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Notandi og reikningar"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Sjálfgefnar stillingar forrits"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Tungumál: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Stillingar"</string>
     <string name="search_menu" msgid="6283419262313758339">"Leitarstillingar"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Leitarstillingar"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Skipta út hljóðum vinnuprófíls?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Skipta út"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Núverandi hljóðum vinnuprófílsins verður skipt út fyrir hljóð úr persónulega prófílnum"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Stilla tilkynningar"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Tilkynningastillingar"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Ítarlegt"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Vinnutilkynningar"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Hægt blikkandi tilkynningaljós"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Þri 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Þri 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Þri 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Sjá allt"</string>
-    <string name="see_less" msgid="1250265310929558370">"Sjá minna"</string>
     <string name="disconnected" msgid="5787956818111197212">"Aftengt"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> notuð"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index c51cea9..fab69eb 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Disconnetti"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versione <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Rimuovi VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Sostituire la rete VPN esistente?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Sei già collegato a una rete VPN. Se ti connetti a un\'altra rete, la VPN attuale verrà sostituita."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Sostituire la rete VPN esistente?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Impostare la rete VPN sempre attiva?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Se attivi questa impostazione, la connessione Internet non sarà disponibile fino a quando la rete VPN sarà connessa correttamente"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"La rete VPN attuale sarà sostituita e la connessione Internet non sarà disponibile fino a quando la rete VPN sarà connessa correttamente"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Sei già collegato a una rete VPN sempre attiva. Se ti connetti a un\'altra rete, la rete VPN attuale verrà sostituita e la modalità sempre attiva verrà disattivata."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Sei già collegato a una rete VPN. Se ti connetti a un\'altra rete, la VPN attuale verrà sostituita."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Attiva"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Impossibile connettersi alla rete <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Questa app non supporta le reti VPN sempre attive."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Mostra %d elemento nascosto</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Rete e Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivi collegati"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"App e notifiche"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Utente e account"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"App predefinite"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Lingua: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Impostazioni"</string>
     <string name="search_menu" msgid="6283419262313758339">"Impostazioni di ricerca"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Impostazioni di ricerca"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Sostituire suoni lavoro?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Sostituisci"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"I suoni attuali del profilo di lavoro verranno sostituiti con i suoni del tuo profilo personale"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configura le notifiche"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Avanzate"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notifiche di lavoro"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Luce intermittente"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Mar 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Mar 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Mar 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Mostra tutto"</string>
-    <string name="see_less" msgid="1250265310929558370">"Comprimi"</string>
     <string name="disconnected" msgid="5787956818111197212">"Disconnesso"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> di dati utilizzati"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 32d4503..28a6e20 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"נתק"</string>
     <string name="vpn_version" msgid="1939804054179766249">"גרסה <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"‏שכח VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"‏האם להחליף VPN קיים?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"‏אתה כבר מחובר ל-VPN. אם תתחבר לרשת שונה, ה-VPN הקיים תוחלף."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"‏האם להחליף רשת VPN קיימת?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"‏האם להגדיר את רשת ה-VPN בחיבור תמידי?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"‏על ידי הפעלת הגדרה זו לא יהיה לך חיבור אינטרנט עד שחיבור ה-VPN יסתיים בהצלחה"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"‏רשת ה-VPN הקיימת תוחלף ולא יהיה לך חיבור אינטרנט עד שחיבור ה-VPN יסתיים בהצלחה"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"‏אתה כבר מחובר לרשת VPN בחיבור תמידי. אם תתחבר לרשת VPN שונה, הרשת הקיימת תוחלף ומצב החיבור התמידי ייכבה."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"‏אתה כבר מחובר לרשת VPN. אם תתחבר לרשת VPN שונה, הרשת הקיימת תוחלף."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"הפעל"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> לא מצליחה להתחבר"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"‏אפליקציה זו אינה תומכת באפשרות של רשת VPN הפועלת תמיד"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2568,10 +2573,12 @@
       <item quantity="other">‏הצג %d פריטים מוסתרים</item>
       <item quantity="one">‏הצג פריט %d מוסתר</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"רשת ואינטרנט"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"מכשירים מחוברים"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"אפליקציות והודעות"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"משתמש וחשבונות"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"אפליקציות ברירות מחדל"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"שפה: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"הגדרות"</string>
     <string name="search_menu" msgid="6283419262313758339">"הגדרות חיפוש"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"הגדרות חיפוש"</string>
@@ -2673,7 +2680,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"להחליף צלילי פרופיל עבודה?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"החלף"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"הצלילים המוגדרים לפרופיל העבודה שלך יוחלפו בצלילים שהוגדרו לפרופיל האישי"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"הגדרת הודעות"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"העדפות התראה"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"מתקדם"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"הודעות עבודה"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"תאורת התראה מהבהבת"</string>
@@ -3095,8 +3102,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"יום שלישי 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"יום שלישי 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"יום שלישי 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"הצג הכל"</string>
-    <string name="see_less" msgid="1250265310929558370">"הצג פחות"</string>
     <string name="disconnected" msgid="5787956818111197212">"מנותק"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> מהנתונים בשימוש"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index a92f2ac..66a657d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -2284,8 +2284,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"接続を解除"</string>
     <string name="vpn_version" msgid="1939804054179766249">"バージョン<xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN を削除"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"既存の VPN を置き換えますか?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"VPN に既に接続されています。別の VPN に接続する場合は、既存の VPN が置き換えられます。"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"既存の VPN を置き換えますか?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"常時接続 VPN を設定しますか?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"この設定を有効にすると、VPN に接続するまではインターネットに接続できなくなります"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"既存の VPN が置き換えられ、VPN に接続するまではインターネットに接続できなくなります"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"すでに常時接続 VPN に接続しています。別の VPN に接続する場合は、既存の VPN が置き換えられ、常時接続モードは無効になります。"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"すでに VPN に接続しています。別の VPN に接続する場合は、既存の VPN が置き換えられます。"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"有効にする"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"「<xliff:g id="VPN_NAME">%1$s</xliff:g>」に接続できません"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"このアプリは常時接続 VPN に対応していません。"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2526,10 +2531,12 @@
       <item quantity="other">%d 件の非表示のアイテムを表示</item>
       <item quantity="one">%d 件の非表示のアイテムを表示</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"ネットワークとインターネット"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"接続済みの端末"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"アプリと通知"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ユーザーとアカウント"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"デフォルトのアプリ"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"言語: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"設定"</string>
     <string name="search_menu" msgid="6283419262313758339">"検索設定"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"検索設定"</string>
@@ -2611,10 +2618,10 @@
     <string name="emergency_tone_alert" msgid="8941852695428130667">"アラート"</string>
     <string name="emergency_tone_vibrate" msgid="8281126443204950847">"バイブレーション"</string>
     <string name="boot_sounds_title" msgid="567029107382343709">"電源オンの音"</string>
-    <string name="zen_mode_settings_title" msgid="2689740350895257590">"通知を非表示"</string>
+    <string name="zen_mode_settings_title" msgid="2689740350895257590">"マナーモード"</string>
     <string name="zen_mode_priority_settings_title" msgid="2623117023031824309">"優先する通知のみを許可"</string>
     <string name="zen_mode_automation_settings_title" msgid="4228995740594063774">"自動ルール"</string>
-    <string name="zen_mode_automation_suggestion_title" msgid="3373871113435938830">"[通知を非表示] スケジュールの設定"</string>
+    <string name="zen_mode_automation_suggestion_title" msgid="3373871113435938830">"マナーモード スケジュールの設定"</string>
     <string name="zen_mode_automation_suggestion_summary" msgid="8554080399360506596">"所定の時間にマナーモードにする"</string>
     <string name="zen_mode_option_important_interruptions" msgid="3903928008177972500">"優先する通知のみ"</string>
     <string name="zen_mode_option_alarms" msgid="5785372117288803600">"アラームのみ"</string>
@@ -2631,7 +2638,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"仕事用プロファイルの音の置換"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"置換"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"現在の仕事用プロファイルの音は個人用プロファイルの音に置き換えられます"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"通知の設定"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"詳細設定"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"仕事用プロファイルの通知"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"光を点滅させて通知"</string>
@@ -2667,8 +2675,8 @@
     </plurals>
     <string name="no_notification_listeners" msgid="3487091564454192821">"通知へのアクセスをリクエストしたインストール済みアプリはありません。"</string>
     <string name="notification_listener_security_warning_title" msgid="5522924135145843279">"<xliff:g id="SERVICE">%1$s</xliff:g>での通知へのアクセスを許可しますか?"</string>
-    <string name="notification_listener_security_warning_summary" msgid="119203147791040151">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> はすべての通知を読み取ることができます。通知には、連絡先名などの個人情報や受信したメッセージの本文も含まれます。また、通知を非表示にしたり、通知内のボタン操作を実行したりすることもできます。\n\nこれにより、アプリが通知の非表示設定を切り替えたり、関連する設定を変更したりすることも可能になります。"</string>
-    <string name="notification_listener_disable_warning_summary" msgid="6738915379642948000">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> の通知アクセスを OFF にすると、[通知を非表示] のアクセスも OFF になります。"</string>
+    <string name="notification_listener_security_warning_summary" msgid="119203147791040151">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> はすべての通知を読み取ることができます。通知には、連絡先名などの個人情報や受信したメッセージの本文も含まれます。また、通知を非表示にしたり、通知内のボタン操作を実行したりすることもできます。\n\nこれにより、アプリがマナーモード設定を切り替えたり、関連する設定を変更したりすることも可能になります。"</string>
+    <string name="notification_listener_disable_warning_summary" msgid="6738915379642948000">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> の通知アクセスを OFF にすると、マナーモードのアクセスも OFF になります。"</string>
     <string name="notification_listener_disable_warning_confirm" msgid="8333442186428083057">"OFF にする"</string>
     <string name="notification_listener_disable_warning_cancel" msgid="8586417377104211584">"キャンセル"</string>
     <string name="vr_listeners_title" msgid="1318901577754715777">"VR ヘルパー サービス"</string>
@@ -2678,16 +2686,16 @@
     <string name="display_vr_pref_title" msgid="8104485269504335481">"端末が VR モードの場合"</string>
     <string name="display_vr_pref_low_persistence" msgid="5707494209944718537">"手ぶれ補正を弱くする(推奨)"</string>
     <string name="display_vr_pref_off" msgid="2190091757123260989">"ちらつきを減らす"</string>
-    <string name="manage_zen_access_title" msgid="2611116122628520522">"[通知を非表示]へのアクセス"</string>
-    <string name="zen_access_empty_text" msgid="8772967285742259540">"[通知を非表示]へのアクセスをリクエストしたインストール済みアプリはありません"</string>
+    <string name="manage_zen_access_title" msgid="2611116122628520522">"マナーモードへのアクセス"</string>
+    <string name="zen_access_empty_text" msgid="8772967285742259540">"マナーモードへのアクセスをリクエストしたインストール済みアプリはありません"</string>
     <string name="loading_notification_apps" msgid="5031818677010335895">"アプリを読み込んでいます..."</string>
     <string name="notification_channels" msgid="8681423709659818791">"チャンネル"</string>
     <string name="app_notification_block_title" msgid="4069351066849087649">"すべてブロック"</string>
     <string name="app_notification_block_summary" msgid="9049487483231233726">"このアプリからの通知を表示しない"</string>
     <string name="channel_notification_block_title" msgid="1570538726036580979">"すべてブロック"</string>
     <string name="channel_notification_block_summary" msgid="3024773079420038146">"このチャンネルからの通知を表示しない"</string>
-    <string name="app_notification_override_dnd_title" msgid="7867458246395884830">"[通知を非表示] をオーバーライドする"</string>
-    <string name="app_notification_override_dnd_summary" msgid="3516007157020189746">"[通知を非表示] が [優先する通知のみ] に設定されているとき、この通知を引き続き表示する"</string>
+    <string name="app_notification_override_dnd_title" msgid="7867458246395884830">"マナーモードをオーバーライドする"</string>
+    <string name="app_notification_override_dnd_summary" msgid="3516007157020189746">"[マナーモード] が [優先する通知のみ] に設定されているとき、この通知を引き続き表示する"</string>
     <string name="app_notification_visibility_override_title" msgid="2187232730902430718">"ロック画面"</string>
     <string name="app_notification_row_banned" msgid="5983655258784814773">"ブロック済み"</string>
     <string name="app_notification_row_priority" msgid="7723839972982746568">"優先"</string>
@@ -2708,9 +2716,9 @@
     <string name="zen_mode_rule_type_unknown" msgid="3049377282766700600">"不明"</string>
     <string name="zen_mode_configure_rule" msgid="8865785428056490305">"ルールを設定"</string>
     <string name="zen_schedule_rule_type_name" msgid="142936744435271449">"時間ルール"</string>
-    <string name="zen_schedule_rule_enabled_toast" msgid="3379499360390382259">"自動ルールでは指定時間内は[通知を非表示]をONに設定します"</string>
+    <string name="zen_schedule_rule_enabled_toast" msgid="3379499360390382259">"自動ルールでは指定時間内はマナーモードを ON に設定します"</string>
     <string name="zen_event_rule_type_name" msgid="2645981990973086797">"予定ルール"</string>
-    <string name="zen_event_rule_enabled_toast" msgid="6910577623330811480">"自動ルールでは指定した予定の間は[通知を非表示]をONに設定します"</string>
+    <string name="zen_event_rule_enabled_toast" msgid="6910577623330811480">"自動ルールでは指定した予定の間はマナーモードを ON に設定します"</string>
     <string name="zen_mode_event_rule_calendar" msgid="8787906563769067418">"対象となる予定"</string>
     <string name="zen_mode_event_rule_summary_calendar_template" msgid="5135844750232403975">"対象となる予定: <xliff:g id="CALENDAR">%1$s</xliff:g>"</string>
     <string name="zen_mode_event_rule_summary_any_calendar" msgid="4936646399126636358">"すべてのカレンダー"</string>
@@ -2765,10 +2773,10 @@
     <string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>までアラームのみに変更します"</string>
     <string name="zen_mode_summary_always" msgid="6172985102689237703">"常に割り込みに変更します"</string>
     <string name="zen_mode_screen_on" msgid="7712038508173845101">"画面が ON のときにブロックする"</string>
-    <string name="zen_mode_screen_on_summary" msgid="6444425984146305149">"[通知を非表示] でサイレントに設定した通知を受信したときに、画面上にポップアップ表示されなくなります"</string>
+    <string name="zen_mode_screen_on_summary" msgid="6444425984146305149">"マナーモードでサイレントに設定した通知を受信したときに、画面上にポップアップ表示されなくなります"</string>
     <string name="zen_mode_screen_off" msgid="5026854939192419879">"画面が OFF のときにブロックする"</string>
-    <string name="zen_mode_screen_off_summary" msgid="6490932947651798094">"[通知を非表示] でサイレントに設定した通知を受信したときに、画面が ON になったり光が点滅したりしなくなります"</string>
-    <string name="zen_mode_screen_off_summary_no_led" msgid="3758698381956461866">"[通知を非表示] でサイレントに設定した通知を受信したときに画面が ON にならなくなります"</string>
+    <string name="zen_mode_screen_off_summary" msgid="6490932947651798094">"マナーモードでサイレントに設定した通知を受信したときに、画面が ON になったり光が点滅したりしなくなります"</string>
+    <string name="zen_mode_screen_off_summary_no_led" msgid="3758698381956461866">"マナーモードでサイレントに設定した通知を受信したときに画面が ON にならなくなります"</string>
     <string name="zen_mode_all_visual_interruptions" msgid="2851308980832487411">"OFF"</string>
     <string name="zen_mode_screen_on_visual_interruptions" msgid="7373348148129140528">"画面が ON のとき"</string>
     <string name="zen_mode_screen_off_visual_interruptions" msgid="4850792880144382633">"画面が OFF のとき"</string>
@@ -2836,7 +2844,7 @@
     <string name="notifications_silenced" msgid="4728603513072110381">"マナーモード"</string>
     <string name="notifications_redacted" msgid="4493588975742803160">"ロック画面にプライベートな内容を表示しない"</string>
     <string name="notifications_hidden" msgid="3619610536038757468">"ロック画面に表示しない"</string>
-    <string name="notifications_priority" msgid="1066342037602085552">"[通知を非表示] をオーバーライド"</string>
+    <string name="notifications_priority" msgid="1066342037602085552">"マナーモードをオーバーライド済み"</string>
     <string name="notifications_summary_divider" msgid="9013807608804041387">" / "</string>
     <string name="notification_summary_level" msgid="2726571692704140826">"レベル %d"</string>
     <plurals name="permissions_summary" formatted="false" msgid="6402730318075959117">
@@ -2859,7 +2867,7 @@
     <string name="filter_work_apps" msgid="24519936790795574">"仕事用"</string>
     <string name="filter_notif_blocked_apps" msgid="3446926933792244485">"ブロック中"</string>
     <string name="filter_with_domain_urls_apps" msgid="4573276638806792792">"ドメインURLあり"</string>
-    <string name="filter_notif_priority_apps" msgid="5056470299318500609">"[通知を非表示] をオーバーライド"</string>
+    <string name="filter_notif_priority_apps" msgid="5056470299318500609">"マナーモードをオーバーライド"</string>
     <string name="filter_notif_sensitive_apps" msgid="3847012996691991486">"ロック画面にプライベートな内容を表示しない"</string>
     <string name="filter_notif_hide_notifications_apps" msgid="3977513041080404368">"ロック画面に表示しない"</string>
     <string name="filter_notif_silent" msgid="8533960664617048281">"マナーモードで表示"</string>
@@ -2977,11 +2985,11 @@
     <string name="running_frequency" msgid="6622624669948277693">"頻度"</string>
     <string name="memory_maximum_usage" msgid="6513785462055278341">"最大使用量"</string>
     <string name="no_data_usage" msgid="9131454024293628063">"データ通信の使用はありません"</string>
-    <string name="zen_access_warning_dialog_title" msgid="1198189958031157142">"<xliff:g id="APP">%1$s</xliff:g>の[通知を非表示]へのアクセスを許可しますか?"</string>
-    <string name="zen_access_warning_dialog_summary" msgid="4015885767653010873">"アプリは[通知を非表示]のON/OFFを切り替えたり、関連する設定を変更したりできるようになります。"</string>
+    <string name="zen_access_warning_dialog_title" msgid="1198189958031157142">"<xliff:g id="APP">%1$s</xliff:g> のマナーモードへのアクセスを許可しますか?"</string>
+    <string name="zen_access_warning_dialog_summary" msgid="4015885767653010873">"アプリはマナーモードの ON / OFF を切り替えたり、関連する設定を変更したりできるようになります。"</string>
     <string name="zen_access_disabled_package_warning" msgid="302820100078584431">"通知アクセスが ON になっているため ON のままにしておく必要があります"</string>
-    <string name="zen_access_revoke_warning_dialog_title" msgid="558779234015793950">"「<xliff:g id="APP">%1$s</xliff:g>」の「通知を非表示」に対する権限を取り消しますか?"</string>
-    <string name="zen_access_revoke_warning_dialog_summary" msgid="5518216907304930148">"このアプリで作成したすべての「通知を非表示」ルールは削除されます。"</string>
+    <string name="zen_access_revoke_warning_dialog_title" msgid="558779234015793950">"<xliff:g id="APP">%1$s</xliff:g> のマナーモードに対する権限を取り消しますか?"</string>
+    <string name="zen_access_revoke_warning_dialog_summary" msgid="5518216907304930148">"このアプリで作成したすべてのマナーモード ルールは削除されます。"</string>
     <string name="ignore_optimizations_on" msgid="6915689518016285116">"最適化しない"</string>
     <string name="ignore_optimizations_off" msgid="6153196256410296835">"最適化する"</string>
     <string name="ignore_optimizations_on_desc" msgid="2321398930330555815">"電池の消耗が速くなる可能性があります"</string>
@@ -3037,8 +3045,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"火 午後6:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"火 午後6:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"火 午後6:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"すべて表示"</string>
-    <string name="see_less" msgid="1250265310929558370">"一部を表示"</string>
     <string name="disconnected" msgid="5787956818111197212">"切断されています"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> のデータを使用しています"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
@@ -3072,7 +3078,7 @@
     <string name="condition_hotspot_summary" msgid="3433182779269409683">"ポータブル Wi-Fi アクセス ポイント(<xliff:g id="ID_1">%1$s</xliff:g>)が有効です。この端末では Wi-Fi が OFF になっています。"</string>
     <string name="condition_airplane_title" msgid="287356299107070503">"機内モードが ON"</string>
     <string name="condition_airplane_summary" msgid="2136872325308526329">"Wi-Fi、Bluetooth、モバイル ネットワークが OFF になっています。電話の発信やインターネットへの接続はできません。"</string>
-    <string name="condition_zen_title" msgid="2679168532600816392">"[通知を非通知] が ON(<xliff:g id="ID_1">%1$s</xliff:g>)"</string>
+    <string name="condition_zen_title" msgid="2679168532600816392">"マナーモードが ON(<xliff:g id="ID_1">%1$s</xliff:g>)"</string>
     <string name="condition_battery_title" msgid="3272131008388575349">"バッテリー セーバー ON"</string>
     <string name="condition_battery_summary" msgid="4418839236027977450">"パフォーマンスが制限されています。位置情報サービスとバックグラウンド データは OFF です。"</string>
     <string name="condition_cellular_title" msgid="2398754272044917264">"モバイルデータ OFF"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 4a60fe7..c7e359e 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"კავშირის გაწყვეტა"</string>
     <string name="vpn_version" msgid="1939804054179766249">"ვერსია <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN-ის დავიწყება"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"გსურთ არსებული VPN-ის ჩანაცვლება?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"თქვენ უკვე დაკავშირებული ხართ VPN-თან. ახალ VPN-თან დაკავშირების შემთხვევაში, არსებული ჩანაცვლდება."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"გსურთ არსებული VPN-ის ჩანაცვლება?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"გსურთ ყოველთვის ჩართული VPN-ის დაყენება?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ამ პარამეტრის ჩართვის შემთხვევაში, VPN-ის წარმატებით დაკავშირებამდე ინტერნეტ-კავშირი არ გექნებათ"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"თქვენი არსებული VPN ჩანაცვლდება და VPN-ის წარმატებით დაკავშირებამდე ინტერნეტ-კავშირი არ გექნებათ"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"თქვენ უკვე დაკავშირებული ხართ ყოველთვის ჩართულ VPN-თან. ახალ VPN-თან დაკავშირების შემთხვევაში, არსებული ჩანაცვლდება, ხოლო ყოველთვის ჩართული რეჟიმი გამოირთვება."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"თქვენ უკვე დაკავშირებული ხართ VPN-თან. ახალ VPN-თან დაკავშირების შემთხვევაში, არსებული ჩანაცვლდება."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ჩართვა"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g>-მა კავშირი ვერ დაამყარა"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ყოველთვის ჩართული VPN მხარდაუჭერელია ამ აპის მიერ."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">%d დამალული ერთეულის ჩვენება</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"ქსელი და ინტერნეტი"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"დაკავშირებული მოწყობილობები"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"აპები და შეტყობინებები"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"მომხმარებელი და ანგარიშები"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"აპის ნაგულისხმევი პარამეტრები"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ენა: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"პარამეტრები"</string>
     <string name="search_menu" msgid="6283419262313758339">"ძიების პარამეტრები"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"ძიების პარამეტრები"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"ჩანაცვლდეს სამსახურის პროფილის ხმები?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ჩანაცვლება"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"სამსახურის პროფილის ამჟამინდელი ხმები თქვენი პირადი პროფილის ხმებით ჩანაცვლდება"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"შეტყობინ. კონფიგურაცია"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"შეტყობინების პარამეტრები"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"გაფართოებული"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"სამსახურის შეტყობინებები"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"მოვლენების ინდიკატორი"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"სამ, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"სამ, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"სამ, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"ყველას ნახვა"</string>
-    <string name="see_less" msgid="1250265310929558370">"ნაკლების ნახვა"</string>
     <string name="disconnected" msgid="5787956818111197212">"გათიშულია"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"გამოყენებულია მონაცემთა <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index bde0e2a..646f09e 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Ажырату"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Нұсқасы: <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN ұмыту"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Бар VPN қолданбасын ауыстыру керек пе?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Сіз VPN желісіне қосылдыңыз. Егер басқа желіге қосылсаңыз, қолданыстағы VPN желісі алмастырылады."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Бар VPN қолданбасын ауыстыру керек пе?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Әрқашан қосулы VPN режимін орнату"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Бұл параметрді іске қоссаңыз, VPN сәтті қосылғанша интернетке қосыла алмайсыз"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Қолданыстағы VPN желісі алмастырылады және VPN сәтті қосылғанша интернетке қосыла алмайсыз"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Сіз әрқашан қосулы VPN желісіне қосылдыңыз. Егер басқа желіге қосылсаңыз, қолданыстағы VPN желісі алмастырылады және әрқашан қосулы режим өшіріледі."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Сіз VPN желісіне қосылдыңыз. Егер басқа желіге қосылсаңыз, қолданыстағы VPN желісі алмастырылады."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Қосу"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> қосыла алмайды"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Бұл қолданба \"әрқашан қосулы\" VPN желісін қолдамайды."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN (Виртуалды жеке желі)"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">%d жасырын элементті көрсету</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Желі және интернет"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Қосылған құрылғылар"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Қолданбалар мен хабарландырулар"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Пайдаланушы және есептік жазбалар"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Қолданбаның әдепкі мәндері"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Тіл: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Параметрлер"</string>
     <string name="search_menu" msgid="6283419262313758339">"Іздеу параметрлері"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Іздеу параметрлері"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Жұмыс профилінің дыбыстары ауыстырылсын ба?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Ауыстыру"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Ағымдағы жұмыс профилі дыбыстарының орнына жеке профильдікі қолданылады"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Хабарландырулар конфигурациясы"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Хабарландыру параметрлері"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Кеңейтілген"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Жұмыс хабарландырулары"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Хабар беру шамы"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Бс 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Бс 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Бс 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Барлығын көру"</string>
-    <string name="see_less" msgid="1250265310929558370">"Азырақ көру"</string>
     <string name="disconnected" msgid="5787956818111197212">"Ажыратылған"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Деректердің <xliff:g id="AMOUNT">%1$s</xliff:g> пайдаланылған"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index e322c82..83d42f5 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ផ្ដាច់"</string>
     <string name="vpn_version" msgid="1939804054179766249">"កំណែ <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"បំភ្លេច VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"ជំនួស VPN ដែលមានស្រាប់ឬ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"អ្នកបានភ្ជាប់ទៅ VPN រួចហើយ។ ប្រសិនបើអ្នកភ្ជាប់ទៅ VPN មួយផ្សេងទៀត នោះ VPN ដែលមានស្រាប់របស់អ្នកនឹងត្រូវបានជំនួស។"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"ជំនួស VPN ដែលមានស្រាប់ឬ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"កំណត់ VPN ឲ្យបើកជានិច្ចឬ?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ប្រសិនបើបើកការកំណត់នេះ អ្នកនឹងមិនមានការតភ្ជាប់អ៊ីនធឺណិតទេ រហូតទាល់តែ VPN នោះបានភ្ជាប់ដោយជោគជ័យ"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"VPN ដែលមានស្រាប់របស់អ្នកនឹងត្រូវបានជំនួស ហើយអ្នកនឹងមិនមានការតភ្ជាប់អ៊ីនធឺណិតទេ រហូតទាល់តែ VPN នោះបានភ្ជាប់ដោយជោគជ័យ"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"អ្នកបានភ្ជាប់ទៅ VPN ដែលបើកជានិច្ចរួចហើយ។ ប្រសិនបើអ្នកភ្ជាប់ទៅ VPN មួយផ្សេងទៀត នោះ VPN ដែលមានស្រាប់របស់អ្នកនឹងត្រូវបានជំនួស ហើយមុខងារបើកជានិច្ចនឹងបិទ។"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"អ្នកបានភ្ជាប់ទៅ VPN រួចហើយ។ ប្រសិនបើអ្នកភ្ជាប់ទៅ VPN មួយផ្សេងទៀត នោះ VPN ដែលមានស្រាប់របស់អ្នកនឹងត្រូវបានជំនួស។"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"បើក"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> មិនអាចភ្ជាប់បានទេ"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"កម្មវិធីនេះមិនគាំទ្ររបៀបបើក VPN ជានិច្ចនោះទេ។"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">បង្ហាញធាតុ %d ដែលបានលាក់</item>
       <item quantity="one">បង្ហាញធាតុ %d ដែលបានលាក់</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"បណ្តាញ និងអ៊ីនធឺណិត"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"ឧបករណ៍ដែលបានភ្ជាប់"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"កម្មវិធី និងការជូនដំណឹង"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"អ្នកប្រើ និងគណនី"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"លំនាំដើមកម្មវិធី"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ភាសា៖ <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ការកំណត់"</string>
     <string name="search_menu" msgid="6283419262313758339">"ការកំណត់ការស្វែងរក"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"កំណត់​ការ​​ស្វែងរក"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"ជំនួសសំឡេងប្រវត្តិការងារឬ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ជំនួស"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"សំឡេងប្រវត្តិរូបការងារបច្ចុប្បន្នរបស់អ្នកនឹងត្រូវបានជំនួសដោយសំឡេងប្រវត្តិរូបផ្ទាល់ខ្លួនរបស់អ្នក"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"កំណត់រចនាសម្ព័ន្ធការជូនដំណឹង"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"កម្រិតខ្ពស់"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"ការជូនដំណឹងពីកន្លែងធ្វើការ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ពន្លឺ​ជូន​ដំណឹង​ភ្លឺបភ្លែត"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"អង្គារ៍ 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"អង្គារ៍ 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"អង្គារ៍ 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"មើលទាំងអស់"</string>
-    <string name="see_less" msgid="1250265310929558370">"​មើល​តិច​ជាង"</string>
     <string name="disconnected" msgid="5787956818111197212">"បាន​ផ្ដាច់"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"បានប្រើទិន្នន័យអស់ <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index c04b861..61b9e1d 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -256,7 +256,7 @@
     <string name="sd_card_settings_label" product="nosdcard" msgid="8101475181301178428">"USB ಸಂಗ್ರಹಣೆ"</string>
     <string name="sd_card_settings_label" product="default" msgid="5743100901106177102">"SD ಕಾರ್ಡ್"</string>
     <string name="proxy_settings_label" msgid="3271174136184391743">"ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="cancel" msgid="6859253417269739139">"ರದ್ದುಮಾಡು"</string>
+    <string name="cancel" msgid="6859253417269739139">"ರದ್ದುಮಾಡಿ"</string>
     <string name="okay" msgid="1997666393121016642">"ಸರಿ"</string>
     <string name="forget" msgid="1400428660472591263">"ಮರೆತುಬಿಡಿ"</string>
     <string name="save" msgid="879993180139353333">"ಉಳಿಸು"</string>
@@ -342,7 +342,7 @@
     <string name="security_settings_fingerprint_enroll_introduction_message" msgid="3508870672887336095">"ನಿಮ್ಮ ಫೋನ್ ಅನ್‌ಲಾಕ್ ಮಾಡಲು, ಖರೀದಿಗಳನ್ನು ದೃಢೀಕರಿಸಲು ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಕೇವಲ ಬೆರಳಚ್ಚು ಸೆನ್ಸರ್ ಸ್ಪರ್ಶಿಸಿ‌. ನೀವು ಸೇರಿಸುವ ಬೆರಳಚ್ಚು‌ಗಳ ಬಗ್ಗೆ ಜಾಗರೂಕರಾಗಿರಿ. ಒಂದು ಹೆಚ್ಚಿನ ಬೆರಳಚ್ಚು ಸಹ ಇವುಗಳಲ್ಲಿ ಯಾವುದನ್ನಾದರೂ ಮಾಡಬಹುದು.\n\nಗಮನಿಸಿ: ನಿಮ್ಮ ಬೆರಳಚ್ಚು ಬಲವಾದ ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ‌ಪಿನ್‌ಗಿಂತ ಕಡಿಮೆ ಸುರಕ್ಷಿತವಾಗಿರಬಹುದು."</string>
     <string name="security_settings_fingerprint_enroll_introduction_message_unlock_disabled" msgid="4193477159493347679">"ಖರೀದಿಗಳನ್ನು ದೃಢೀಕರಿಸಲು ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಕೇವಲ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಸ್ಪರ್ಶಿಸಿ. ನೀವು ಸೇರಿಸುವ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ಗಳ ಬಗ್ಗೆ ಕಾಳಜಿವಹಿಸಿ. ಒಂದು ಹೆಚ್ಚಿನ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸಹ ಇವುಗಳಲ್ಲಿ ಯಾವುದನ್ನಾದರೂ ಮಾಡಬಹುದು.\n\nಗಮನಿಸಿ: ಈ ಸಾಧನವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಲು ನೀವು ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="security_settings_fingerprint_enroll_introduction_message_setup" msgid="3635924459027832861">"ನಿಮ್ಮ ಫೋನ್ ಅನ್‌ಲಾಕ್ ಮಾಡಲು, ಖರೀದಿಗಳನ್ನು ದೃಢೀಕರಿಸಲು ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಕೇವಲ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಸ್ಪರ್ಶಿಸಿ‌. ನೀವು ಯಾರ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ಗಳನ್ನು ಸೇರಿಸುತ್ತೀರಿ ಎಂಬುದರ ಕುರಿತು ಎಚ್ಚರಿಕೆಯಿಂದಿರಿ. ಒಂದು ಸೇರಿಸಲಾದ ಮುದ್ರಣವು ಸಹ ಇವುಗಳಲ್ಲಿ ಯಾವುದನ್ನಾದರೂ ಪೂರೈಸಬಹುದು.\n\nನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ ಬಲವಾದ ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಿನ್‌ಗಿಂತಲೂ ಕಡಿಮೆ ಸುರಕ್ಷತೆ ಹೊಂದಿರಬಹುದು."</string>
-    <string name="security_settings_fingerprint_enroll_introduction_cancel" msgid="3199351118385606526">"ರದ್ದುಮಾಡು"</string>
+    <string name="security_settings_fingerprint_enroll_introduction_cancel" msgid="3199351118385606526">"ರದ್ದುಮಾಡಿ"</string>
     <string name="security_settings_fingerprint_enroll_introduction_continue" msgid="7472492858148162530">"ಮುಂದುವರಿಸು"</string>
     <string name="security_settings_fingerprint_enroll_introduction_cancel_setup" msgid="5021369420474432665">"ಸ್ಕಿಪ್‌"</string>
     <string name="security_settings_fingerprint_enroll_introduction_continue_setup" msgid="8386444182056861429">"ಬೆರಳಚ್ಚು ಸೇರಿಸಿ"</string>
@@ -546,8 +546,8 @@
     <string name="lockpassword_password_recently_used" msgid="4687102591995446860">"ಸಾಧನ ನಿರ್ವಾಹಕ ಇತ್ತೀಚಿನ ಪಾಸ್‌ವರ್ಡ್‌ ಬಳಸಲು ಅನುಮತಿಸುವುದಿಲ್ಲ."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="6830610582179569631">"ಅಂಕಿಗಳ ಆರೋಹಣ, ಅವರೋಹಣ ಅಥವಾ ಪುನಾವರ್ತಿತ ಅನುಕ್ರಮವನ್ನು ನಿಷೇಧಿಸಲಾಗಿದೆ"</string>
     <string name="lockpassword_ok_label" msgid="313822574062553672">"ಸರಿ"</string>
-    <string name="lockpassword_cancel_label" msgid="8818529276331121899">"ರದ್ದುಮಾಡು"</string>
-    <string name="lockpattern_tutorial_cancel_label" msgid="6431583477570493261">"ರದ್ದುಮಾಡು"</string>
+    <string name="lockpassword_cancel_label" msgid="8818529276331121899">"ರದ್ದುಮಾಡಿ"</string>
+    <string name="lockpattern_tutorial_cancel_label" msgid="6431583477570493261">"ರದ್ದುಮಾಡಿ"</string>
     <string name="lockpattern_tutorial_continue_label" msgid="3559793618653400434">"ಮುಂದೆ"</string>
     <string name="lock_setup" msgid="3355847066343753943">"ಸೆಟಪ್ ಪೂರ್ಣಗೊಂಡಿದೆ."</string>
     <string name="device_admin_title" msgid="3562216873644263804">"ಸಾಧನ ನಿರ್ವಹಣೆ"</string>
@@ -774,7 +774,7 @@
     <string name="wifi_failed_forget_message" msgid="1348172929201654986">"ನೆಟ್‌ವರ್ಕ್‌ ಮರೆಯಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="wifi_save" msgid="3331121567988522826">"ಉಳಿಸು"</string>
     <string name="wifi_failed_save_message" msgid="6650004874143815692">"ನೆಟ್‌ವರ್ಕ್‌ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
-    <string name="wifi_cancel" msgid="6763568902542968964">"ರದ್ದುಮಾಡು"</string>
+    <string name="wifi_cancel" msgid="6763568902542968964">"ರದ್ದುಮಾಡಿ"</string>
     <string name="wifi_skip_anyway" msgid="6965361454438011190">"ಅದೇನೇ ಇರಲಿ ಸ್ಕಿಪ್‌ ಮಾಡು"</string>
     <string name="wifi_dont_skip" msgid="3615535136327231588">"ಹಿಂತಿರುಗು"</string>
     <string name="wifi_skipped_message" product="tablet" msgid="6761689889733331124">"ಎಚ್ಚರಿಕೆ: ನೀವು ವೈ-ಫೈ ಸ್ಕಿಪ್ ಮಾಡಿದರೆ, ಆರಂಭಿಕ ಡೌನ್‌ಲೋಡ್‌ಗಳು ಮತ್ತು ನವೀಕರಣಗಳಿಗಾಗಿ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಸೆಲ್ಯುಲಾರ್ ಡೇಟಾವನ್ನು ಮಾತ್ರ ಬಳಸುತ್ತದೆ. ಸಂಭಾವ್ಯ ಡೇಟಾ ಶುಲ್ಕಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು, ವೈ-ಫೈ ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ."</string>
@@ -795,7 +795,7 @@
     <string name="wifi_advanced_settings_label" msgid="3654366894867838338">"IP ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="wifi_advanced_not_available" msgid="5823045095444154586">"ಈ ಬಳಕೆದಾರರಿಗೆ ವೈ ಫೈ ಸುಧಾರಿತ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"ಉಳಿಸು"</string>
-    <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"ರದ್ದುಮಾಡು"</string>
+    <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"ರದ್ದುಮಾಡಿ"</string>
     <string name="wifi_ip_settings_invalid_ip_address" msgid="2513142355364274970">"ಮಾನ್ಯವಾದ IP ವಿಳಾಸವನ್ನು ಟೈಪ್‌ ಮಾಡಿ."</string>
     <string name="wifi_ip_settings_invalid_gateway" msgid="8164264988361096450">"ಮಾನ್ಯವಾದ ಗೇಟ್‌ವೇ ವಿಳಾಸವನ್ನು ಟೈಪ್‌ ಮಾಡಿ."</string>
     <string name="wifi_ip_settings_invalid_dns" msgid="8744583948328391047">"ಮಾನ್ಯವಾದ DNS ವಿಳಾಸವನ್ನು ಟೈಪ್‌ ಮಾಡಿ."</string>
@@ -999,7 +999,7 @@
     <string name="sim_change_succeeded" msgid="8556135413096489627">"ಸಿಮ್‌ ಪಿನ್‌ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
     <string name="sim_lock_failed" msgid="2489611099235575984">"ಸಿಮ್‌ ಕಾರ್ಡ್ ಲಾಕ್ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.\nಬಹುಶಃ ತಪ್ಪಾದ ಪಿನ್‌."</string>
     <string name="sim_enter_ok" msgid="6475946836899218919">"ಸರಿ"</string>
-    <string name="sim_enter_cancel" msgid="6240422158517208036">"ರದ್ದುಮಾಡು"</string>
+    <string name="sim_enter_cancel" msgid="6240422158517208036">"ರದ್ದುಮಾಡಿ"</string>
     <string name="sim_multi_sims_title" msgid="9159427879911231239">"ಬಹು ಸಿಮ್‌ ಗಳು ಕಂಡುಬಂದಿವೆ"</string>
     <string name="sim_multi_sims_summary" msgid="7018740080801483990">"ಸೆಲ್ಯುಲಾರ್ ಡೇಟಾಗೆ ನೀವು ಬಯಸುವ ಸಿಮ್‌ ಆಯ್ಕೆಮಾಡಿ."</string>
     <string name="sim_change_data_title" msgid="294357201685244532">"ಡೇಟಾ ಸಿಮ್‌ ಬದಲಾಯಿಸುವುದೇ?"</string>
@@ -1501,7 +1501,7 @@
     <string name="clear_data_dlg_title" msgid="5605258400134511197">"ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾ ಅಳಿಸುವುದೇ?"</string>
     <string name="clear_data_dlg_text" msgid="3951297329833822490">"ಈ ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ನ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಇದರಲ್ಲಿ ಎಲ್ಲ ಫೈಲ್‌ಗಳು, ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಖಾತೆಗಳು, ಡೇಟಾಬೇಸ್‌ಗಳು ಇತರೆ ಒಳಗೊಂಡಿರುತ್ತದೆ."</string>
     <string name="dlg_ok" msgid="2402639055725653590">"ಸರಿ"</string>
-    <string name="dlg_cancel" msgid="1674753358972975911">"ರದ್ದುಮಾಡು"</string>
+    <string name="dlg_cancel" msgid="1674753358972975911">"ರದ್ದುಮಾಡಿ"</string>
     <string name="app_not_found_dlg_title" msgid="3127123411738434964"></string>
     <string name="app_not_found_dlg_text" msgid="4893589904687340011">"ಸ್ಥಾಪಿಸಲಾಗಿರುವ ಅಪ್ಲಿಕೇಶನ್‍ಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿಲ್ಲ."</string>
     <string name="clear_data_failed" msgid="7214074331627422248">"ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ."</string>
@@ -1814,7 +1814,7 @@
     <string name="print_print_jobs" msgid="3582094777756968793">"ಮುದ್ರಣ ಕಾರ್ಯಗಳು"</string>
     <string name="print_print_job" msgid="7563741676053287211">"ಮುದ್ರಣ ಕಾರ್ಯ"</string>
     <string name="print_restart" msgid="8373999687329384202">"ಮರುಪ್ರಾರಂಭಿಸಿ"</string>
-    <string name="print_cancel" msgid="3621199386568672235">"ರದ್ದುಮಾಡು"</string>
+    <string name="print_cancel" msgid="3621199386568672235">"ರದ್ದುಮಾಡಿ"</string>
     <string name="print_job_summary" msgid="8472427347192930694">"<xliff:g id="PRINTER">%1$s</xliff:g>\n<xliff:g id="TIME">%2$s</xliff:g>"</string>
     <string name="print_printing_state_title_template" msgid="5736107667714582025">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ಮುದ್ರಿಸಲಾಗುತ್ತಿದೆ"</string>
     <string name="print_cancelling_state_title_template" msgid="7102968925358219875">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ರದ್ದು ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
@@ -2083,7 +2083,7 @@
     <string name="wifi_setup_connect" msgid="7954456989590237049">"ಸಂಪರ್ಕಪಡಿಸು"</string>
     <string name="wifi_setup_forget" msgid="2562847595567347526">"ಮರೆತುಬಿಡು"</string>
     <string name="wifi_setup_save" msgid="3659235094218508211">"ಉಳಿಸು"</string>
-    <string name="wifi_setup_cancel" msgid="3185216020264410239">"ರದ್ದುಮಾಡು"</string>
+    <string name="wifi_setup_cancel" msgid="3185216020264410239">"ರದ್ದುಮಾಡಿ"</string>
     <string name="wifi_setup_status_scanning" msgid="5317003416385428036">"ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಸ್ಕ್ಯಾನ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
     <string name="wifi_setup_status_select_network" msgid="3960480613544747397">"ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಗೊಳಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="wifi_setup_status_existing_network" msgid="6394925174802598186">"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಗೊಳಿಸಿ"</string>
@@ -2268,7 +2268,7 @@
     <string name="vpn_not_used" msgid="9094191054524660891">"(ಬಳಸಲಾಗಿಲ್ಲ)"</string>
     <string name="vpn_no_ca_cert" msgid="8776029412793353361">"(ಸರ್ವರ್‌ ಅನ್ನು ಪರಿಶೀಲಿಸದಿರು)"</string>
     <string name="vpn_no_server_cert" msgid="2167487440231913330">"(ಸರ್ವರ್‌ನಿಂದ ಸ್ವೀಕರಿಸಲಾಗಿದೆ)"</string>
-    <string name="vpn_cancel" msgid="1979937976123659332">"ರದ್ದುಮಾಡು"</string>
+    <string name="vpn_cancel" msgid="1979937976123659332">"ರದ್ದುಮಾಡಿ"</string>
     <string name="vpn_done" msgid="8678655203910995914">"ವಜಾಗೊಳಿಸು"</string>
     <string name="vpn_save" msgid="4233484051644764510">"ಉಳಿಸು"</string>
     <string name="vpn_connect" msgid="8469608541746132301">"ಸಂಪರ್ಕಿಸು"</string>
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
     <string name="vpn_version" msgid="1939804054179766249">"<xliff:g id="VERSION">%s</xliff:g> ಆವೃತ್ತಿ"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN ಮರೆತುಬಿಡು"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಸ್ಥಾನಾಂತರಿಸುವುದೇ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"ನೀವು ಈಗಾಗಲೇ VPN ಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವಿರಿ. ಒಂದು ವೇಳೆ ನೀವು ಬೇರೊಂದಕ್ಕೆ ಸಂಪರ್ಕಗೊಂಡಲ್ಲಿ, ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಅನ್ನು ಸ್ಥಾನಾಂತರಿಸಲಾಗುವುದು."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಸ್ಥಾನಾಂತರಿಸುವುದೇ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"VPN ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವಂತೆ ಹೊಂದಿಸುವುದೇ?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ಈ ಸೆಟ್ಟಿಂಗ್ ಆನ್ ಮಾಡುವ ಮೂಲಕ, VPN ಯಶಸ್ವಿಯಾಗಿ ಸಂಪರ್ಕವಾಗುವವರೆಗೆ ನೀವು ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದುವುದಿಲ್ಲ"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಅನ್ನು ಸ್ಥಾನಾಂತರಿಸಲಾಗುವುದು ಮತ್ತು VPN ಯಶಸ್ವಿಯಾಗಿ ಸಂಪರ್ಕವಾಗುವವರೆಗೆ ನೀವು ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದುವುದಿಲ್ಲ"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವ VPN ಗೆ ನೀವು ಈಗಾಗಲೇ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ. ನೀವು ಬೇರೊಂದಕ್ಕೆ ಸಂಪರ್ಕಗೊಂಡಲ್ಲಿ, ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಅನ್ನು ಸ್ಥಾನಾಂತರಿಸಲಾಗುವುದು ಮತ್ತು ಯಾವಾಗಲೂ ಆನ್ ಮೋಡ್‌ನಲ್ಲಿರುವುದನ್ನು ಆಫ್ ಮಾಡಲಾಗುತ್ತದೆ."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"ನೀವು ಈಗಾಗಲೇ VPN ಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವಿರಿ. ಒಂದು ವೇಳೆ ನೀವು ಬೇರೊಂದಕ್ಕೆ ಸಂಪರ್ಕಗೊಂಡಲ್ಲಿ, ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಅನ್ನು ಸ್ಥಾನಾಂತರಿಸಲಾಗುವುದು."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ಆನ್ ಮಾಡು"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ಸಂಪರ್ಕ ಸಾಧ್ಯವಿಲ್ಲ"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಯಾವಾಗಲೂ-ಆನ್ VPN ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2319,7 +2324,7 @@
     <string name="new_backup_pw_prompt" msgid="8755501377391998428">"ಸಂಪೂರ್ಣ ಬ್ಯಾಕಪ್‌ಗಳಿಗಾಗಿ ಹೊಸ ಪಾಸ್‌ವರ್ಡನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ"</string>
     <string name="confirm_new_backup_pw_prompt" msgid="3238728882512787864">"ನಿಮ್ಮ ಹೊಸ ಪೂರ್ಣ ಬ್ಯಾಕಪ್ ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ಇಲ್ಲಿ ಮರುಟೈಪ್ ಮಾಡಿ"</string>
     <string name="backup_pw_set_button_text" msgid="2387480910044648795">"ಬ್ಯಾಕಪ್ ಪಾಸ್‌ವರ್ಡ್‌ ಹೊಂದಿಸಿ"</string>
-    <string name="backup_pw_cancel_button_text" msgid="8845630125391744615">"ರದ್ದುಮಾಡು"</string>
+    <string name="backup_pw_cancel_button_text" msgid="8845630125391744615">"ರದ್ದುಮಾಡಿ"</string>
     <string name="additional_system_update_settings_list_item_title" msgid="214987609894661992">"ಹೆಚ್ಚುವರಿ ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
     <string name="selinux_status_disabled" msgid="924551035552323327">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="selinux_status_permissive" msgid="6004965534713398778">"ಅನುಮೋದನೆ"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">%d ಮರೆಮಾಡಲಾದ ಐಟಂಗಳನ್ನು ತೋರಿಸಿ</item>
       <item quantity="other">%d ಮರೆಮಾಡಲಾದ ಐಟಂಗಳನ್ನು ತೋರಿಸಿ</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"ನೆಟ್‌ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಸಾಧನಗಳು"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ಬಳಕೆದಾರ ಮತ್ತು ಖಾತೆಗಳು"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ಅಪ್ಲಿಕೇಶನ್ ಡಿಫಾಲ್ಟ್‌ಗಳು"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ಭಾಷೆ: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="search_menu" msgid="6283419262313758339">"ಹುಡುಕಾಟ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"ಹುಡುಕಾಟ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಧ್ವನಿಗಳನ್ನು ಬದಲಾಯಿಸುವುದೇ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ಸ್ಥಾನಾಂತರಿಸು"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಧ್ವನಿಗಳನ್ನು ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ ಧ್ವನಿಯಾಗಿ ಸ್ಥಾನಾಂತರಿಸಲಾಗುತ್ತದೆ"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"ಸುಧಾರಿತ"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"ಕೆಲಸದ ಅಧಿಸೂಚನೆಗಳು"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ಪಲ್ಸ್ ಅಧಿಸೂಚನೆ ಬೆಳಕು"</string>
@@ -2666,7 +2674,7 @@
     <string name="notification_listener_security_warning_summary" msgid="119203147791040151">"ಸಂಪರ್ಕ ಹೆಸರುಗಳು ಮತ್ತು ನೀವು ಸ್ವೀಕರಿಸುವ ಸಂದೇಶಗಳ ಪಠ್ಯದಂತಹ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ ಸೇರಿದಂತೆ <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> ಗೆ ಎಲ್ಲ ಅಧಿಸೂಚನೆಗಳನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ. ಇದಕ್ಕೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾ ಮಾಡಲು ಅಥವಾ ಅವುಗಳು ಹೊಂದಿರುವಂತಹ ಕ್ರಿಯೆ ಬಟನ್‌ಗಳನ್ನು ಟ್ರಿಗ್ಗರ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ. \n\nಈ ಅಪ್ಲಿಕೇಶನ್ ಸಂಬಂಧಿಸಿದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಮತ್ತು ಅಡಚಣೆ ಮಾಡಬೇಡ ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನೀಡುತ್ತದೆ."</string>
     <string name="notification_listener_disable_warning_summary" msgid="6738915379642948000">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> ಗೆ ನೀವು ಅಧಿಸೂಚನೆ ಪ್ರವೇಶಿಸುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡಿದರೆ, ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಪ್ರವೇಶವು ಸಹ ಆಫ್ ಆಗಬಹುದು."</string>
     <string name="notification_listener_disable_warning_confirm" msgid="8333442186428083057">"ಆಫ್ ಮಾಡು"</string>
-    <string name="notification_listener_disable_warning_cancel" msgid="8586417377104211584">"ರದ್ದು ಮಾಡು"</string>
+    <string name="notification_listener_disable_warning_cancel" msgid="8586417377104211584">"ರದ್ದು ಮಾಡಿ"</string>
     <string name="vr_listeners_title" msgid="1318901577754715777">"VR ಸಹಾಯ ಸೇವೆಗಳು"</string>
     <string name="no_vr_listeners" msgid="2689382881717507390">"ಯಾವುದೇ ಸ್ಥಾಪಿಸಿದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು VR ಸಹಾಯಕ ಸೇವೆಗಳ ರೀತಿಯಲ್ಲಿ ರನ್ ಮಾಡಲು ವಿನಂತಿಸಿಲ್ಲ."</string>
     <string name="vr_listener_security_warning_title" msgid="8309673749124927122">"<xliff:g id="SERVICE">%1$s</xliff:g> ಗೆ VR ಸೇವೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"ಮಂಗಳ 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"ಮಂಗಳ 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"ಮಂಗಳ 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string>
-    <string name="see_less" msgid="1250265310929558370">"ಕಡಿಮೆ ನೋಡಿ"</string>
     <string name="disconnected" msgid="5787956818111197212">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ಡೇಟಾ ಬಳಸಲಾಗಿದೆ"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 00b2048..3b6ae5b 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"연결 해제"</string>
     <string name="vpn_version" msgid="1939804054179766249">"버전 <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN 삭제"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"기존 VPN을 교체하시겠습니까?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"이미 VPN에 연결되어 있습니다. 다른 VPN에 연결하면 기존 VPN은 교체됩니다."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"기존 VPN을 교체하시겠습니까?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"연결 유지 VPN을 설정하시겠습니까?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"이 설정을 사용하면 VPN이 연결될 때까지 인터넷에 연결되지 않습니다."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"기존 VPN이 교체되며 VPN에 연결될 때까지 인터넷에 연결되지 않습니다."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"이미 연결 유지 VPN에 연결되어 있습니다. 다른 VPN에 연결하면 기존 VPN은 교체되며 연결 유지 모드가 사용 중지됩니다."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"이미 VPN에 연결되어 있습니다. 다른 VPN에 연결하면 기존 VPN은 교체됩니다."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"사용"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g>에 연결할 수 없습니다."</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"이 앱은 연결 유지 VPN을 지원하지 않습니다."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">%d개의 숨겨진 항목 표시</item>
       <item quantity="one">%d개의 숨겨진 항목 표시</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"네트워크 및 인터넷"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"연결된 기기"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"앱 및 알림"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"사용자 및 계정"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"앱 기본값"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"언어: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"설정"</string>
     <string name="search_menu" msgid="6283419262313758339">"검색 설정"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"검색 설정"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"직장 프로필 사운드 바꾸기"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"바꾸기"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"현재 직장 프로필 사운드가 개인 프로필 사운드로 대체됩니다."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"알림 구성"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"고급"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"직장 알림"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"알림등 반복 표시"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"화요일 오후 6시 1분"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"화요일 오후 6시 2분"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"화요일 오후 6시 3분"</string>
-    <string name="see_all" msgid="8883901630052886984">"모두 보기"</string>
-    <string name="see_less" msgid="1250265310929558370">"간략히 보기"</string>
     <string name="disconnected" msgid="5787956818111197212">"연결 해제됨"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"데이터 <xliff:g id="AMOUNT">%1$s</xliff:g> 사용됨"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 776529d..a0d06f2 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -2279,8 +2279,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Ажыратуу"</string>
     <string name="vpn_version" msgid="1939804054179766249">"<xliff:g id="VERSION">%s</xliff:g> версиясы"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN профили унутулсун"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Учурдагы VPN алмаштырылсынбы?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"VPN кызматы туташылган. Эгер башкасына туташсаңыз, учурдагы VPN өчүрүлөт."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Учурдагы VPN алмаштырылсынбы?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Дайым иштеген VPN\'ди жөндөө керекпи?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Бул орнотууну куйгүзүү менен VPN ийгиликтүү туташмайынча, интернетиңиз жок болуп турат"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Күйгүзүлгөн VPN\'ңиз алмаштырылып, VPN ийгиликтүү туташмайынча, интернетиңиз жок болуп турат"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Дайым иштеген VPN кызматыңыз туташылган. Эгер башкасына туташсаңыз, учурдагы VPN алмаштырылып, дайым күйүк режими өчүрүлүп калат."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"VPN кызматы туташылган. Эгер башкасына туташсаңыз, учурдагы VPN өчүрүлөт."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Күйгүзүү"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> туташпай жатат"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Бул колдонмо дайым иштеген VPN кызматына туташпайт."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,8 +2527,11 @@
       <item quantity="one">Жашырылган %d нерсе көрсөтүлсүн</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Тармак жана Интернет"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Туташкан түзмөктөр"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Колдонмолор жана эскертмелер"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Колдонуучу жана каттоо эсептери"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Демейки колдонмолор"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Тили: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Жөндөөлөр"</string>
     <string name="search_menu" msgid="6283419262313758339">"Издөө жөндөөлөрү"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Издөө жөндөөлөрү"</string>
@@ -2625,7 +2633,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Үндөр алмаштырылсынбы?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Алмаштыруу"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Учурдагы жумуш профилиңиздин үндөрү жеке профилиңиздин үндөрү менен алмаштырылат."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Эскертмелерди жөндөө"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Өркүндөтүлгөн"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Жумуш боюнча эскертмелер"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Тармактын индикатору"</string>
@@ -3031,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Шй. 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Шй. 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Шй. 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Бардыгын көрүү"</string>
-    <string name="see_less" msgid="1250265310929558370">"Азыраак көрүү"</string>
     <string name="disconnected" msgid="5787956818111197212">"Ажыратылган"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Дайындардын <xliff:g id="AMOUNT">%1$s</xliff:g> колдонулду"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 929aa93..2d5b789 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ຕັດການເຊື່ອມຕໍ່"</string>
     <string name="vpn_version" msgid="1939804054179766249">"ເວີ​ຊັນ <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"ລືມ VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"ຂຽນທັບ VPN ທີ່ມີຢູ່ກ່ອນແລ້ວຂອງທ່ານບໍ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"ທ່ານເຊື່ອມຕໍ່ຫາ VPN ຢູ່ກ່ອນແລ້ວ. ຫາກທ່ານເຊື່ອມຕໍ່ຫາອັນອື່ນອີກ, VPN ທີ່ມີຢູ່ແລ້ວຂອງທ່ານຈະຖືກແທນທີ່."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"ຂຽນທັບ VPN ທີ່ມີຢູ່ກ່ອນແລ້ວຂອງທ່ານບໍ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Set always-on VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"By turning on this setting, you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Your existing VPN will be replaced, and you won\'t have an Internet connection until the VPN successfully connects"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"You\'re already connected to an always-on VPN. If you connect to a different one, your existing VPN will be replaced, and always-on mode will turn off."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"ທ່ານເຊື່ອມຕໍ່ຫາ VPN ຢູ່ກ່ອນແລ້ວ. ຫາກທ່ານເຊື່ອມຕໍ່ຫາອັນອື່ນອີກ, VPN ທີ່ມີຢູ່ແລ້ວຂອງທ່ານຈະຖືກແທນທີ່."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ເປີດໃຊ້"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ແອັບນີ້ບໍ່ຮອງຮັບ VPN ແບບເປີດຕະຫຼອດເວລາ."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">ສະແດງ %d ລາຍການທີ່ເຊື່ອງໄວ້</item>
       <item quantity="one">ສະແດງ %d ລາຍການທີ່ເຊື່ອງໄວ້</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່ແລ້ວ"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ແອັບ ແລະ ການແຈ້ງເຕືອນ"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"User &amp; accounts"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"App defaults"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Language: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"​ການ​ຕັ້ງ​ຄ່າ"</string>
     <string name="search_menu" msgid="6283419262313758339">"​ການ​ຕັ້ງ​ຄ່າ​ການ​ຊອກ​ຫາ"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"​ການ​ຕັ້ງ​ຄ່າ​ການ​ຊອກ​ຫາ"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"ແທນທີ່ສຽງໂປຣໄຟລ໌ບ່ອນເຮັດວຽກບໍ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ແທນທີ່"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"ສຽງໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານໃນປັດຈຸບັນຈະຖືກແທນທີ່ດ້ວຍສຽງໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານ"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"ປັບແຕ່ງການແຈ້ງເຕືອນ"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"​ຂັ້ນ​ສູງ"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"ການແຈ້ງເຕືອນວຽກ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ໄຟກະພິບແຈ້ງເຕືອນ"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"ອັງຄານ 6:01 ໂມງແລງ"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"ອັງຄານ 6:02 ໂມງແລງ"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"ອັງຄານ 6:03 ໂມງແລງ"</string>
-    <string name="see_all" msgid="8883901630052886984">"ເບິ່ງ​ທັງ​ໝົດ"</string>
-    <string name="see_less" msgid="1250265310929558370">"​​ເບິ່ງ​ໜ້ອຍ​ລົງ"</string>
     <string name="disconnected" msgid="5787956818111197212">"​ຕັດ​ການ​ເຊື່ອມ​ຕໍ່​ແລ້ວ"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"ໃຊ້ຂໍ້ມູນໄປແລ້ວ <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index d61c372..d2e09e0 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Atsijungti"</string>
     <string name="vpn_version" msgid="1939804054179766249">"<xliff:g id="VERSION">%s</xliff:g> versija"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Pamiršti VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Pakeisti esamą VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Jau prisijungėte prie VPN. Prisijungus prie kito VPN, esamas VPN bus pakeistas."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Pakeisti esamą VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Nustatyti visada įjungtą VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Įjungę šį nustatymą neturėsite interneto ryšio, kol VPN nebus sėkmingai įjungtas"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Esamas VPN bus pakeistas ir jūs neturėsite interneto ryšio, kol VPN nebus sėkmingai įjungtas"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Jau esate prisijungę prie visada įjungto VPN. Jei prisijungsite prie kito VPN, esamas VPN bus pakeistas ir visada įjungto VPN režimas bus išjungtas."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Jau esate prisijungę prie VPN. Jei prisijungsite prie kito VPN, esamas VPN bus pakeistas."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Įjungti"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Nepavyko prisijungti prie „<xliff:g id="VPN_NAME">%1$s</xliff:g>“"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ši programa nepalaiko visada įjungto VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2567,8 +2572,11 @@
       <item quantity="other">Rodyti %d paslėptų elementų</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Tinkas ir internetas"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Prijungti įrenginiai"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Programos ir pranešimai"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Naudotojas ir paskyros"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Programos numatytieji nustatymai"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Kalba: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Nustatymai"</string>
     <string name="search_menu" msgid="6283419262313758339">"Paieškos nustatymai"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Paieškos nustatymai"</string>
@@ -2670,7 +2678,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Pakeisti darbo profil. garsus?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Pakeisti"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Dabartiniai darbo profilio garsai bus pakeisti asmeninio profilio garsais"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Pranešimų konfigūravimas"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Pranešimų nuostatos"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Išplėstiniai"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Darbo profilio pranešimai"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsuojanti įspėjimo šviesa"</string>
@@ -3094,8 +3102,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"A., 18.01 val."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"A., 18.02 val."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"A., 18.03 val."</string>
-    <string name="see_all" msgid="8883901630052886984">"Žr. viską"</string>
-    <string name="see_less" msgid="1250265310929558370">"Žr. mažiau"</string>
     <string name="disconnected" msgid="5787956818111197212">"Atsijungta"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Panaudota duomenų: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 3bde22c..a6cf1a0 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -2297,8 +2297,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Pārtraukt savienojumu"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versija <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Aizmirst VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Vai aizstāt esošo VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Jau ir izveidots savienojums ar VPN. Izveidojot savienojumu ar citu VPN, esošais tiks aizstāts."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Vai aizstāt esošo VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Vai iestatīt vienmēr ieslēgtu VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ieslēdzot šo iestatījumu, jums nebūs interneta savienojuma, kamēr nebūs sekmīgi izveidots VPN savienojums."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Jūsu esošais VPN tiks aizstāts, un jums nebūs interneta savienojuma, kamēr nebūs sekmīgi izveidots VPN savienojums."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Jūs jau esat izveidojis savienojumu ar vienmēr ieslēgtu VPN. Ja izveidosiet savienojumu ar citu VPN, esošais VPN tiks aizstāts un režīms “vienmēr ieslēgts” tiks izslēgts."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Jau ir izveidots savienojums ar VPN. Izveidojot savienojumu ar citu VPN, esošais tiks aizstāts."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Ieslēgt"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g>: nevar izveidot savienojumu"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Šajā lietotnē netiek atbalstīts vienmēr ieslēgts VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2544,10 +2549,12 @@
       <item quantity="one">Rādīt %d slēptu vienumu</item>
       <item quantity="other">Rādīt %d slēptus vienumus</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Tīkls un internets"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Pievienotās ierīces"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Lietotnes un paziņojumi"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Lietotāji un konti"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Noklusējuma lietotnes"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Valoda: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Iestatījumi"</string>
     <string name="search_menu" msgid="6283419262313758339">"Meklēšanas iestatījumi"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Meklēšanas iestatījumi"</string>
@@ -2649,7 +2656,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Aizstāt darba profila signālus?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Aizstāt"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Jūsu pašreizējā darba profila signāli tiks aizstāti ar jūsu personiskā profila signāliem."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Paziņojumu konfigurēšana"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Paziņojumu preferences"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Papildu"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Darba paziņojumi"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsa paziņojuma indikators"</string>
@@ -3063,8 +3070,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Otrdien plkst. 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Otrdien plkst. 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Otrdien plkst. 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Skatīt visus"</string>
-    <string name="see_less" msgid="1250265310929558370">"Skatīt mazāk"</string>
     <string name="disconnected" msgid="5787956818111197212">"Atvienots"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Izmantoti <xliff:g id="AMOUNT">%1$s</xliff:g> datu"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index e923fff..fef1182 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Исклучи"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Верзија <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Заборави VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Да се замени постоечката VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Веќе сте поврзани на VPN. Ако се поврзете на друга мрежа, постојната VPN ќе биде заменета."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Да се замени постојната VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Да се постави „секогаш вклучена“ VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ако ја вклучите поставкава, нема да имате интернет-врска сѐ додека VPN успешно се поврзе"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Вашата постојна VPN ќе се замени и нема да имате интернет-врска сѐ додека VPN успешно се поврзе"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Веќе сте поврзани на „секогаш вклучена“ VPN. Ако се поврзете на друга мрежа, вашата постојна VPN ќе се замени и режимот „секогаш вклучена“ ќе се исклучи."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Веќе сте поврзани на VPN. Ако се поврзете на друга мрежа, вашата постојна VPN ќе се замени."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Вклучете"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> не може да се поврзе"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Оваа апликација не поддржува постојано вклучен VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"Виртуелна приватна мрежа (VPN)"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">Прикажи %d сокриена ставка</item>
       <item quantity="other">Прикажи %d сокриени ставки</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Мрежа и Интернет"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Поврзани уреди"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Апликации и известувања"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Корисник и сметки"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Стандардни апликации"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Јазик: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Поставки"</string>
     <string name="search_menu" msgid="6283419262313758339">"Поставки за пребарување"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Поставки за пребарување"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Заменете звуци на раб. профил?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Замени"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Тековните звуци на работниот профил ќе бидат заменети со звуците од личниот профил"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Конфигурирајте известувања"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Напредни"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Известувања за работен профил"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Пулсирачко светло за известување"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Вто 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Вто 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Вто 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Види ги сите"</string>
-    <string name="see_less" msgid="1250265310929558370">"Види помалку"</string>
     <string name="disconnected" msgid="5787956818111197212">"Исклучено"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> од податоците се искористени"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index df0b42d..d6ed12e 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"വിച്ഛേദിക്കുക"</string>
     <string name="vpn_version" msgid="1939804054179766249">"പതിപ്പ് <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN മറക്കുക"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"നിലവിലുള്ള VPN-ന് പകരം പുതിയതാക്കണോ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"ഇതിനകം തന്നെ നിങ്ങൾ ഒരു VPN-ലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ട്. നിങ്ങൾ വേറൊരു VPN-ലേക്ക് കണക്റ്റുചെയ്യുന്ന പക്ഷം, നിലവിലുള്ളതിന് പകരം പുതിയത് ഉപയോഗിക്കും."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"നിലവിലുള്ള VPN-ന് പകരം പുതിയതാക്കണോ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"\'എല്ലായ്പ്പോഴും ഓൺ\' VPN സജ്ജമാക്കണോ?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ഈ ക്രമീകരണം ഓണാക്കുകയാണെങ്കിൽ, VPN കണക്റ്റുചെയ്യുന്നത് വരെ നിങ്ങൾക്ക് ഇന്റർനെറ്റ് കണക്ഷൻ ഉണ്ടായിരിക്കുകയില്ല."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"നിലവിലുള്ള VPN-ന് പകരം പുതിയത് ഉപയോഗിക്കും, VPN കണക്റ്റുചെയ്യുന്നത് വരെ നിങ്ങൾക്ക് ഇന്റർനെറ്റ് കണക്ഷൻ ഉണ്ടായിരിക്കുകയുമില്ല."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"ഇതിനകം തന്നെ നിങ്ങളൊരു \'എല്ലായ്പ്പോഴും ഓൺ\' VPN-ലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ട്. നിങ്ങൾ വേറൊരു VPN-ലേക്ക് കണക്റ്റുചെയ്യുന്ന പക്ഷം, നിലവിലുള്ളതിന് പകരം പുതിയത് ഉപയോഗിക്കും, \'എല്ലായ്പ്പോഴും ഓൺ\' മോഡ് ഓഫാവുകയും ചെയ്യും."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"ഇതിനകം തന്നെ നിങ്ങൾ ഒരു VPN-ലേക്ക് കണക്റ്റുചെയ്തിട്ടുണ്ട്. നിങ്ങൾ വേറൊരു VPN-ലേക്ക് കണക്റ്റുചെയ്യുന്ന പക്ഷം, നിലവിലുള്ളതിന് പകരം പുതിയത് ഉപയോഗിക്കും."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ഓൺ ചെയ്യുക"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> കണക്റ്റുചെയ്യാൻ കഴിയില്ല"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ഈ ആപ്പ് \'എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN\' പിന്തുണയ്ക്കുന്നില്ല."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">മറച്ച %d ഇനങ്ങൾ കാണിക്കുക</item>
       <item quantity="one">മറച്ച %d ഇനം കാണിക്കുക</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"നെറ്റ്‌വർക്കും ഇന്റർനെറ്റും"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"കണക്‌റ്റുചെയ്‌ത ഉപകരണങ്ങൾ"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ആപ്‌സും അറിയിപ്പുകളും"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ഉപയോക്താവും അക്കൗണ്ടുകളും"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ആപ്പ് ഡിഫോൾട്ടുകൾ"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ഭാഷ: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ക്രമീകരണം"</string>
     <string name="search_menu" msgid="6283419262313758339">"തിരയൽ ക്രമീകരണം"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"തിരയൽ ക്രമീകരണങ്ങൾ"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"ഔദ്യോഗിക പ്രൊഫൈൽ ശബ്ദങ്ങൾ മാറ്റണോ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"മാറ്റിസ്ഥാപിക്കുക"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"നിങ്ങളുടെ നിലവിലെ ഔദ്യോഗിക പ്രൊഫൈൽ ശബ്ദങ്ങൾക്ക് പകരമായി നിങ്ങളുടെ വ്യക്തിഗത പ്രൊഫൈൽ ശബ്ദങ്ങൾ ഉപയോഗിക്കപ്പെടും"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"അറിയിപ്പ് കോൺഫിഗർചെയ്യൂ"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"വിപുലമായത്"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"ഔദ്യോഗിക അറിയിപ്പുകൾ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"അറിയിപ്പുലൈറ്റ് പ്രകാശിപ്പിക്കൂ"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"ചൊവ്വ 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"ചൊവ്വ 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"ചൊവ്വ 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"എല്ലാം കാണുക"</string>
-    <string name="see_less" msgid="1250265310929558370">"കുറച്ച് കാണുക"</string>
     <string name="disconnected" msgid="5787956818111197212">"വിച്ഛേദിച്ചു"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ഡാറ്റ ഉപയോഗിച്ചു"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 4d97773..ff83d6a 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -1690,7 +1690,7 @@
     <string name="battery_history_minutes_no_seconds" msgid="7780294302606853082">"<xliff:g id="MINUTES">%1$d</xliff:g>м"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Ашиглалтын статистик"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Ашиглалтын статистик"</string>
-    <string name="display_order_text" msgid="8592776965827565271">"Эрэмблэх:"</string>
+    <string name="display_order_text" msgid="8592776965827565271">"Эрэмбэлэх:"</string>
     <string name="app_name_label" msgid="5440362857006046193">"Апп"</string>
     <string name="last_time_used_label" msgid="8459441968795479307">"Ашигласан сүүлийн цаг"</string>
     <string name="usage_time_label" msgid="295954901452833058">"Ашиглалтын цаг"</string>
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Салгах"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Хувилбар <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN мартсан"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Энэ VPN-ийг солих уу?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Та VPN-д аль хэдийн холбогдсон байна. Хэрэв та өөр VPN-д холбогдвол одоогийн ашиглаж байгаа VPN-г орлуулах болно."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Энэ VPN-г солих уу?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"VPN-г тогтмол асаалттайгаар тохируулах уу?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Та энэ тохиргоог асааснаар VPN-г холбогдох хүртэл Интернэтэд холбогдох боломжгүй болно"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Таны одоогийн VPN-г солих бөгөөд та VPN-г холбогдох хүртэл Интернэтэд холбогдох боломжгүй болно"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Та аль хэдийн тогтмол асаалттай VPN-д холбогдсон байна. Хэрэв та өөр холболтод холбогдвол таны одоогийн VPN-г сольж, тогтмол асаалттай горим унтрах болно."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Та аль хэдийн VPN-д холбогдсон байна. Хэрэв та өөр холболтод холбогдвол одоогийн ашиглаж байгаа VPN-г солих болно."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Асаах"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> холбогдох боломжгүй байна"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Энэ апп нь тотгмол асаалттай VPN-г дэмждэггүй."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Нуусан %d зүйлийг харуулах</item>
       <item quantity="one">Нуусан %d зүйлийг харуулах</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Сүлжээ &amp; интернэт"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Холбогдсон төхөөрөмж"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Апп; мэдэгдэл"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Хэрэглэгч &amp; бүртгэл"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Апп-н өгөгдмөл"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Хэл: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Тохиргоо"</string>
     <string name="search_menu" msgid="6283419262313758339">"Хайлтын тохиргоо"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Хайлтын тохиргоо"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Ажлын профайлын дууг солих уу?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Солих"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Таны ажлын профайлын одоогийн дууг таны хувийн профайлын дуугаар солих болно"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Мэдэгдлийг оновчлох"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Нарийвчилсан"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Ажлын мэдэгдэл"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Анивчих мэдэгдлийн гэрэл"</string>
@@ -3031,8 +3039,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Мя 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Мя 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Мя 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Бүгдийг харах"</string>
-    <string name="see_less" msgid="1250265310929558370">"Цөөнийг харах"</string>
     <string name="disconnected" msgid="5787956818111197212">"Салгасан"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> датаг ашигласан"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index ca64607..8f3e1da 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"‍डिस्कनेक्ट करा"</string>
     <string name="vpn_version" msgid="1939804054179766249">"आवृत्ती <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN विसरा"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"विद्यमान VPN पुनर्स्थित करायचे?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"आपण आधीपासून एका VPN शी कनेक्ट केले आहे. आपण भिन्न VPN शी कनेक्ट केल्यास, आपले विद्यमान VPN बदलले जाईल."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"विद्यमान VPN पुनर्स्थित करायचे?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"नेहमी-चालू VPN सेट करायचे?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"हे सेटिंग चालू करून, VPN यशस्वीरित्या कनेक्ट करेपर्यंत आपल्याकडे इंटरनेट कनेक्शन असणार नाही"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"आपले विद्यमान VPN पुनर्स्थित केले जाईल आणि VPN यशस्वीरित्या कनेक्ट करेपर्यंत आपल्याकडे इंटरनेट कनेक्शन असणार नाही"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"आपण आधीपासून नेहमी-चालू VPN शी कनेक्ट केले आहे. आपण एका भिन्न VPN शी कनेक्ट केल्यास, आपले विद्यमान VPN पुनर्स्थित केले जाईल आणि नेहमी-चालू मोड बंद होईल."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"आपण आधीपासून एका VPN शी कनेक्ट केले आहे. आपण भिन्न VPN शी कनेक्ट केल्यास, आपले विद्यमान VPN बदलले जाईल."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"चालू करा"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> कनेक्ट करू शकत नाही"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"हा अॅप नेहमी-चालू VPN ला समर्थन देत नाही."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">%d लपविलेला आयटम दर्शवा</item>
       <item quantity="other">%d लपविलेले आयटम दर्शवा</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"नेटवर्क आणि इंटरनेट"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"कनेक्‍ट केलेले डिव्‍हाइसेस"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"अॅप्स आणि सूचना"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"वापरकर्ता आणि खाती"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"अॅप डीफॉल्ट"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"भाषा: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"सेटिंग्ज"</string>
     <string name="search_menu" msgid="6283419262313758339">"शोध सेटिंग्ज"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"शोध सेटिंग्ज"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"कार्य प्रोफाईल ध्वनी पुनर्स्थित करायचे?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"पुनर्स्थित करा"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"आपले वर्तमान कार्य प्रोफाइल ध्वनी आपल्या वैयक्तिक प्रोफाइल ध्वनींनी पुनर्स्थित केले जातील"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"सूचना कॉन्फिगर करा"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"प्रगत"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"कार्य सूचना"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"पल्स सूचना प्रकाश"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"मंगळवारी 6:01PM वाजता"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"मंगळवारी 6:02PM वाजता"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"मंगळवारी 6:03PM वाजता"</string>
-    <string name="see_all" msgid="8883901630052886984">"सर्व पहा"</string>
-    <string name="see_less" msgid="1250265310929558370">"कमी पहा"</string>
     <string name="disconnected" msgid="5787956818111197212">"डिस्कनेक्ट केले"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> डेटा वापरला"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 18655cb..e3f572e 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Putuskan sambungan"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versi <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Lupakan VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Gantikan VPN yang sedia ada?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Anda sudah disambungkan ke VPN. Jika anda menyambung ke VPN yang lain, VPN anda yang sedia ada akan digantikan."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Gantikan VPN yang sedia ada?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Tetapkan VPN sentiasa hidup?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Dengan menghidupkan tetapan ini, anda tidak akan ada sambungan Internet sehingga VPN berjaya disambungkan"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"VPN anda yang sedia ada akan digantikan dan anda tidak akan ada sambungan Internet sehingga VPN berjaya disambungkan"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Anda sudah disambungkan ke VPN sentiasa hidup. Jika anda menyambung ke VPN yang lain, VPN anda yang sedia ada akan digantikan dan mod sentiasa hidup akan dimatikan."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Anda sudah disambungkan ke VPN. Jika anda menyambung ke VPN yang lain, VPN anda yang sedia ada akan digantikan."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Hidupkan"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> tidak dapat menyambung"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Apl ini tidak menyokong VPN yang sentiasa hidup"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Tunjukkan %d item yang tersembunyi</item>
       <item quantity="one">Tunjukkan %d item yang tersembunyi</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Rangkaian &amp; Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Peranti yang disambungkan"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apl &amp; pemberitahuan"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Pengguna &amp; akaun"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Lalai apl"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Bahasa: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Tetapan"</string>
     <string name="search_menu" msgid="6283419262313758339">"Tetapan carian"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Tetapan carian"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Gantikan bunyi profil kerja?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Gantikan"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Bunyi profil kerja semasa akan digantikan dengan bunyi profil peribadi anda."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurasikan pemberitahuan"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Terperinci"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Pemberitahuan kerja"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Kelip lampu pemberitahuan"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Sel 6:01PTG"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Sel 6:02PTG"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Sel 6:03 PTG"</string>
-    <string name="see_all" msgid="8883901630052886984">"Lihat semua"</string>
-    <string name="see_less" msgid="1250265310929558370">"Lihat kurang"</string>
     <string name="disconnected" msgid="5787956818111197212">"Diputuskan sambungan"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> data digunakan"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 976bbad..5b473ce 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
     <string name="vpn_version" msgid="1939804054179766249">"ဗားရှင်း <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN ကိုမေ့လိုက်ပါ"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"ရှိပြီးသား VPN ကိုအစားထိုးမလား။"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"VPN သို့ချိတ်ဆက်ပြီးသား ဖြစ်ပါသည်။ အခြားတစ်ခုသို့ ချိတ်ဆက်လျှင်၊ လက်ရှိ VPN ကိုအစားထိုးသွားပါမည်။"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"ရှိပြီးသား VPN ကိုအစားထိုးမလား။"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"VPN ကို အမြဲတမ်းဖွင့်ထားရန် သတ်မှတ်မလား။"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ဤဆက်တင်ကို ဖွင့်ခြင်းဖြင့် VPN အောင်မြင်စွာ မချိတ်မချင်း သင့်တွင် အင်တာနက်ချိတ်ဆက်မှု ရှိမည်မဟုတ်ပါ"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"သင်၏ လက်ရှိ VPN ကို အစားထိုးသွားမည်ဖြစ်၍ VPN အောင်မြင်စွာ မချိတ်မချင်း သင့်ထံတွင် အင်တာနက် ချိတ်ဆက်မှု ရှိမည်မဟုတ်ပါ"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"သင်သည် အမြဲတမ်းဖွင့်ထားရသော VPN နှင့် ချိတ်ဆက်ပြီးသားဖြစ်သည်။ အခြားတစ်ခုနှင့် ချိတ်ဆက်လိုက်လျှင် လက်ရှိ VPN ကို အစားထိုးသွားမည်ဖြစ်၍ အမြဲဖွင့်ထားရသော မုဒ်သည် ပိတ်သွားပါမည်။"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"VPN သို့ ချိတ်ဆက်ပြီးသား ဖြစ်ပါသည်။ အခြားတစ်ခုသို့ ချိတ်ဆက်လျှင် လက်ရှိ VPN ကိုအစားထိုးသွားပါမည်။"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ဖွင့်ရန်"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ချိတ်ဆက်၍မရပါ"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ဤအက်ပ်သည် VPN အမြဲတမ်းဖွင့်ထားခြင်းကို ပံ့ပိုးမှုမရှိပါ။"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,9 +2527,12 @@
       <item quantity="other">ဖျောက်ထားသည့် %d ခုကို ပြပါ</item>
       <item quantity="one">ဖျောက်ထားသည့် %d ခုကို ပြပါ</item>
     </plurals>
-    <string name="network_dashboard_title" msgid="4771589228992391573">"ကွန်ရန်နှင့် အင်တာနက်"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"ကွန်ရက်နှင့် အင်တာနက်"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"ချိတ်ဆက်ထားသော စက်ပစ္စည်းများ"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"အက်ပ်များနှင့် အကြောင်းကြားချက်များ"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"အသုံးပြုသူနှင့် အကောင့်များ"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"အက်ပ်မူရင်းဆက်တင်များ"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ဘာသာစကား - <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ဆက်တင်များ"</string>
     <string name="search_menu" msgid="6283419262313758339">"ရှာဖွေမှု ဆက်တင်များ"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"ရှာဖွေမှု ဆက်တင်များ"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"အလုပ်၏အသံများကို အစားထိုးမလား။"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"အစားထိုးရန်"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"သင့်လက်ရှိအလုပ်ပရိုဖိုင်ဆိုင်ရာ အသံများကို သင်၏ကိုယ်ရေးကိုယ်တာပရိုဖိုင်ဆိုင်ရာအသံများနှင့် အစားထိုးလိုက်ပါမည်။"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"အကြောင်းကြားချက်များ သတ်မှတ်ခြင်း"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"အကြောင်းကြားချက် ရွေးချယ်မှု"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"အဆင့်မြင့်"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"အလုပ်သတိပေးချက်များ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"အကြောင်းကြားချက်ပြ မီးဖွင့်ရန်"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"အင်္ဂါနေ့ ညနေ ၆:၀၁"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"အင်္ဂါနေ့ ညနေ ၆:၀၂"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"အင်္ဂါနေ့ ညနေ ၆:၀၃"</string>
-    <string name="see_all" msgid="8883901630052886984">"အားလုံးကြည့်ပါ"</string>
-    <string name="see_less" msgid="1250265310929558370">"လျှော့ ကြည့်ရန်"</string>
     <string name="disconnected" msgid="5787956818111197212">"ချိတ်ဆက်မှုပြတ်တောက်သည်"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"ဒေတာ၏ <xliff:g id="AMOUNT">%1$s</xliff:g> ကိုအသုံးပြုထားသည်"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index cc15f65..2df0648 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Koble fra"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versjon <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Glem VPN-profilen"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Vil du erstatte det nåværende VPN-et?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Du er allerede koblet til et VPN. Hvis du kobler til et nytt VPN, erstattes tilkoblingen til det nåværende VPN-et."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Vil du erstatte det nåværende VPN-et?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Vil du angi alltid på-VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ved å slå på denne innstillingen kommer du ikke til å ha Internett-tilkobling før VPN-tilkoblingen er opprettet."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Det eksisterende VPN-et ditt blir byttet ut, og du kommer ikke til å ha Internett-tilkobling før VPN-tilkoblingen er opprettet."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Du er allerede koblet til et alltid på-VPN. Hvis du kobler til et annet, blir det eksisterende VPN-et byttet ut, og alltid på-modus blir slått av."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Du er allerede koblet til et VPN. Hvis du kobler til et nytt VPN, erstattes tilkoblingen til det nåværende VPN-et."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Slå på"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Kan ikke koble til <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Denne appen støtter ikke alltid-på VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Vis %d skjult element</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Nettverk og Internett"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Tilkoblede enheter"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apper og varsler"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Bruker og kontoer"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Appstandarder"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Språk: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Innstillinger"</string>
     <string name="search_menu" msgid="6283419262313758339">"Søkeinnstillinger"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Søkeinnstillinger"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Bytte lyder for jobbprofilen?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Erstatt"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"De nåværende lydene for jobbprofilen din blir byttet ut med lydene for den personlige profilen din"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurer varsler"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Avansert"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Jobbvarsler"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"La varsellampen pulsere"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"tirs kl. 18.01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"tirs kl. 18.02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"tirs kl. 18.03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Se alle"</string>
-    <string name="see_less" msgid="1250265310929558370">"Se mindre"</string>
     <string name="disconnected" msgid="5787956818111197212">"Frakoblet"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> av dataen er brukt"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index 5f122ec..0fa96ce 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"विच्छेदन गर्नुहोस्"</string>
     <string name="vpn_version" msgid="1939804054179766249">"संस्करण <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN लाई बिर्सनुहोस्"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"विद्यमान VPN लाई बदल्ने हो?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"तपाईँले पहिले नै एउटा VPN मा जडान गर्नुभएको छ। तपाईँले कुनै नयाँ VPN मा ज‍डान गर्नुभयो भने तपाईँको विद्यमान VPN लाई प्रतिस्थापन गरिनेछ।"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"विद्यमान VPN लाई बदल्ने हो?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"सधैँ-सक्रिय VPN लाई सेट गर्ने हो?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"यो सेटिङलाई सक्रिय गरेर सफलतापूर्वक VPN जडान नहोउन्जेलसम्म तपाईंसँग इन्टरनेट जडान हुने छैन"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"तपाईंको विद्यमान VPN लाई प्रतिस्थापन गरिने छ र सफलतापूर्वक VPN जडान नहोउन्जेल तपाईंसँग इन्टरनेट जडान हुने छैन"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"तपाईँले पहिले नै एउटा सधैं-सक्रिय VPN मा जडान गर्नुभएको छ। तपाईंले अर्को कुनै VPN मा ज‍डान गर्नुभयो भने तपाईंको विद्यमान VPN लाई प्रतिस्थापन गरिनेछ र सधैं-सक्रिय मोड निष्क्रिय हुने छ।"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"तपाईँले पहिले नै एउटा VPN मा जडान गर्नुभएको छ। तपाईँले कुनै नयाँ VPN मा ज‍डान गर्नुभयो भने तपाईँको विद्यमान VPN लाई प्रतिस्थापन गरिनेछ।"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"सक्रिय गर्नुहोस्"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> जडान गर्न सक्दैन"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"यस अनुप्रयोगले सधैँ सक्रिय रहने VPN लाई समर्थन गर्दैन।"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">लुकाइएका %d वस्तुहरू देखाउनुहोस्</item>
       <item quantity="one">लुकाइएको %d वस्तु देखाउनुहोस्</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"नेटवर्क र इन्टरनेट"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"जडान गरिएका यन्त्रहरू"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"अनुप्रयोग सम्बन्धी &amp; सूचनाहरू"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"प्रयोगकर्ता रamp; खाता"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"अनुप्रयोगको पूर्वनिर्धारित अवस्था"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"भाषा: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"सेटिङहरू"</string>
     <string name="search_menu" msgid="6283419262313758339">"खोज सेटिङहरू"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"खोज सेटिङहरू"</string>
@@ -2627,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"कार्य प्रोफाइलका ध्वनिहरूलाई प्रतिस्थापन गर्ने हो?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"प्रतिस्थापन गर्नुहोस्"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"तपाईँको हालको कार्य प्रोफाइलका ध्वनिहरूलाई तपाईँको व्यक्तिगत प्रोफाइलका ध्वनिहरूले प्रतिस्थापन गरिनेछ"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"सूचनाहरू कन्फिगर गर्नुहोस्"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"सूचना सम्बन्धी प्राथमिकताहरू"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"उन्‍नत"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"कार्यका सूचनाहरू"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"प्रकाशका सम्बन्धमा पल्स सूचना"</string>
@@ -3033,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"मंगलबार बेलुका ६.०१ बजे"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"मंगलबार बेलुका ६.०२ बजे"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"मंगलबार बेलुका ६.०३ बजे"</string>
-    <string name="see_all" msgid="8883901630052886984">"सबै हेर्नुहोस्"</string>
-    <string name="see_less" msgid="1250265310929558370">"कम हेर्नुहोस्"</string>
     <string name="disconnected" msgid="5787956818111197212">"विच्छेद भयो"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"डेटाको <xliff:g id="AMOUNT">%1$s</xliff:g> प्रयोग गरियो"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d64ba7e..93db5c2 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Verbinding verbreken"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versie <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN vergeten"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Bestaande VPN vervangen?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Je hebt al verbinding met een VPN. Als je verbinding met een ander VPN maakt, wordt je bestaande VPN vervangen."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Bestaande VPN vervangen?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Always-on VPN instellen?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Als je deze instelling inschakelt, wordt de internetverbinding verbroken totdat het VPN verbinding heeft gemaakt"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Je bestaande VPN wordt vervangen en je hebt pas weer internetverbinding nadat het VPN verbinding heeft gemaakt"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Je hebt al verbinding met een Always-on VPN. Als je verbinding maakt met een ander VPN, wordt je bestaande VPN vervangen en wordt de Always-on-modus uitgeschakeld."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Je hebt al verbinding met een VPN. Als je verbinding met een ander VPN maakt, wordt je bestaande VPN vervangen."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Inschakelen"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> kan geen verbinding maken"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Deze app biedt geen ondersteuning voor Always-on VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">%d verborgen item weergeven</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Netwerk en internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Verbonden apparaten"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps en meldingen"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Gebruiker en accounts"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Standaard-apps"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Taal: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Instellingen"</string>
     <string name="search_menu" msgid="6283419262313758339">"Zoekinstellingen"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Zoekinstellingen"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Geluid werkprofiel vervangen?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Vervangen"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"De huidige geluiden van je werkprofiel worden vervangen door de huidige geluiden van je persoonlijke profiel"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Meldingen configureren"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Meldingsvoorkeuren"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Geavanceerd"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Werkmeldingen"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Meldingslampje knippert"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Di. 18:01 uur"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Di. 18:02 uur"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Di. 18:03 uur"</string>
-    <string name="see_all" msgid="8883901630052886984">"Alles weergeven"</string>
-    <string name="see_less" msgid="1250265310929558370">"Minder weergeven"</string>
     <string name="disconnected" msgid="5787956818111197212">"Verbinding verbroken"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> van data gebruikt"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index fb69f16..1cc7bc2 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
     <string name="vpn_version" msgid="1939804054179766249">"ਸੰਸਕਰਨ <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN ਨੂੰ ਛੱਡੋ"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"ਕੀ ਮੌਜੂਦਾ VPN ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ ਹੈ?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"ਤੁਸੀਂ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਕਿਸੇ VPN ਨਾਲ ਕਨੈਕਟ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਨਾਲ ਕਨੈਕਟ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵਰਤਮਾਨ VPN ਨੂੰ ਤਬਦੀਲ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"ਕੀ ਮੌਜੂਦਾ VPN ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ ਹੈ?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"ਕੀ ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN ਨੂੰ ਸੈੱਟ ਕਰਨਾ ਹੈ?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨ ਨਾਲ, ਤੁਹਾਡੇ ਕੋਲ ਇੱਕ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਤਦ ਤੱਕ ਨਹੀਂ ਹੋਵੇਗਾ ਜਦ ਤੱਕ VPN ਸਫ਼ਲਤਾਪੂਰਵਕ ਕਨੈਕਟ ਨਹੀਂ ਹੋ ਜਾਂਦਾ"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"ਤੁਹਾਡੇ ਮੌਜੂਦਾ VPN ਨੂੰ ਤਬਦੀਲ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ, ਅਤੇ ਤੁਹਾਡੇ ਕੋਲ ਤਦ ਤੱਕ ਇੱਕ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਨਹੀਂ ਹੋਵੇਗਾ ਜਦ ਤੱਕ VPN ਸਫ਼ਲਤਾਪੂਰਵਕ ਕਨੈਕਟ ਨਹੀਂ ਹੋ ਜਾਂਦਾ"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN ਨਾਲ ਕਨੈਕਟ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਨਾਲ ਕਨੈਕਟ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਮੌਜੂਦਾ VPN ਨੂੰ ਤਬਦੀਲ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ, ਅਤੇ ਹਮੇਸ਼ਾ-ਚਾਲੂ ਮੋਡ ਬੰਦ ਹੋ ਜਾਵੇਗਾ।"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"ਤੁਸੀਂ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਕਿਸੇ VPN ਨਾਲ ਕਨੈਕਟ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਨਾਲ ਕਨੈਕਟ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੇ ਵਰਤਮਾਨ VPN ਨੂੰ ਤਬਦੀਲ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ਚਾਲੂ ਕਰੋ"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ਇਹ ਐਪ ਹਮੇਸ਼ਾਂ-ਚਾਲੂ ਰਹਿਣ ਵਾਲੇ VPN ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਹੈ।"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">%d ਲੁਕੀਆਂ ਹੋਈਆਂ ਆਈਟਮਾਂ ਵਿਖਾਓ</item>
       <item quantity="other">%d ਲੁਕੀਆਂ ਹੋਈਆਂ ਆਈਟਮਾਂ ਵਿਖਾਓ</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"ਕਨੈਕਟ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ਐਪਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ਵਰਤੋਂਕਾਰ ਅਤੇ ਖਾਤੇ"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ਐਪ ਪੂਰਵ-ਨਿਰਧਾਰਤ"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ਭਾਸ਼ਾ: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="search_menu" msgid="6283419262313758339">"ਖੋਜ ਸੈੱਟਿੰਗਜ਼"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"ਖੋਜ ਸੈਟਿੰਗਾਂ"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"ਕੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਧੁਨੀਆਂ ਬਦਲਣੀਆਂ ਹਨ?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ਬਦਲੋ"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"ਤੁਹਾਡੀਆਂ ਵਰਤਮਾਨ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਧੁਨੀਆਂ ਤੁਹਾਡੀਆਂ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਧੁਨੀਆਂ ਦੇ ਨਾਲ ਬਦਲੀਆਂ ਜਾਣਗੀਆਂ"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"ਸੂਚਨਾਵਾਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"ਉੱਨਤ"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"ਕੰਮ ਸਬੰਧੀ ਸੂਚਨਾਵਾਂ"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ਪਲਸ ਸੂਚਨਾ ਲਾਈਟ"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"ਮੰਗਲ 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"ਮੰਗਲ 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"ਮੰਗਲ 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"ਸਭ ਵੇਖੋ"</string>
-    <string name="see_less" msgid="1250265310929558370">"ਘੱਟ ਵੇਖੋ"</string>
     <string name="disconnected" msgid="5787956818111197212">"ਡਿਸਕਨੈਕਟ ਹੋਇਆ"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ਡੈਟਾ ਵਰਤਿਆ ਗਿਆ"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index d2df975..8df1f3d 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Odłącz"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Wersja <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Zapomnij VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Zastąpić obecną sieć VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Masz już połączenie z siecią VPN. Jeśli połączysz się z inną, obecna zostanie zastąpiona."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Zastąpić obecną sieć VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Ustawić stały VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Po włączeniu tego ustawienia utracisz połączenie internetowe do czasu nawiązania połączenia przez VPN"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Dotychczasowe połączenie VPN zostanie zastąpione i nie będziesz mieć połączenia internetowego do czasu połączenia z VPN"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Masz już połączenie ze stałą siecią VPN. Jeśli połączysz się z inną, obecna zostanie zastąpiona, a tryb stały zostanie wyłączony."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Masz już połączenie z siecią VPN. Jeśli połączysz się z inną, obecna zostanie zastąpiona."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Włącz"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Nie można połączyć z siecią <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ta aplikacja nie obsługuje łączenia tylko przez sieć VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2567,8 +2572,11 @@
       <item quantity="one">Pokaż %d ukryty element</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Sieć i internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Połączone urządzenia"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikacje i powiadomienia"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Użytkownik i konta"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Domyślne aplikacje"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Język: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Ustawienia"</string>
     <string name="search_menu" msgid="6283419262313758339">"Ustawienia wyszukiwania"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Ustawienia wyszukiwania"</string>
@@ -2670,7 +2678,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Zastąpić dźwięki w profilu do pracy?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Zastąp"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Dźwięki w Twoim profilu do pracy zostaną zastąpione dźwiękami z Twojego profilu osobistego."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Skonfiguruj powiadomienia"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Zaawansowane"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Powiadomienia związane z pracą"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsująca dioda"</string>
@@ -3092,8 +3101,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Wt. 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Wt. 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Wt. 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Pokaż wszystko"</string>
-    <string name="see_less" msgid="1250265310929558370">"Pokaż mniej"</string>
     <string name="disconnected" msgid="5787956818111197212">"Rozłączono"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Użycie danych: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 0cb1232..072e344 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desconectar"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versão <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Esquecer VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Substituir VPN já existente?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Você já está conectado a uma VPN. Caso se conecte a uma diferente, a VPN já existente será substituída."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Substituir VPN já existente?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Configurar VPN sempre ativa?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Se você ativar esta configuração, sua conexão com a Internet não estará disponível até que a VPN se conecte"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Sua VPN já existente será substituída, e você não terá uma conexão com a Internet até que a VPN se conecte"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Você já está conectado a uma VPN sempre ativa. Caso se conecte a uma diferente, a VPN já existente será substituída, e o modo sempre ativo será desativado."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Você já está conectado a uma VPN. Caso se conecte a uma diferente, a VPN já existente será substituída."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Ativar"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Não é possível conectar-se a <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Este app não é compatível com VPN sempre ativa."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">Mostrar %d item oculto</item>
       <item quantity="other">Mostrar %d itens ocultos</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Rede e Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivos conectados"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps e notificações"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Usuário e contas"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Padrões de apps"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Configurações"</string>
     <string name="search_menu" msgid="6283419262313758339">"Configurações de pesquisa"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Configurações de pesquisa"</string>
@@ -2627,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Substituir sons do perfil de trabalho?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Substituir"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Os sons atuais do seu perfil de trabalho serão substituídos pelos sons do seu perfil pessoal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurar notificações"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferências de notificação"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avançadas"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificações de trabalho"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsar luz de notificação"</string>
@@ -3033,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Ter 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Ter 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Ter 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Ver tudo"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ver menos"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desconectado"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de dados usados"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index c5826b4..2000835 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desligar"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versão <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Esquecer VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Pretende substituir a VPN existente?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Já está ligado a uma VPN. Se ligar a outra, a VPN existente será substituída."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Pretende substituir a VPN existente?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Pretende definir a VPN como sempre ativa?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ao ativar esta definição, não terá uma ligação à Internet até a VPN estabelecer ligação com êxito"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"A sua VPN existente será substituída e não terá uma ligação à Internet até a VPN estabelecer ligação com êxito"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Já está ligado a uma VPN sempre ativa. Se ligar a outra, a VPN existente será substituída e o modo sempre ativo será desativado."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Já está ligado a uma VPN. Se ligar a outra, a VPN existente será substituída."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Ativar"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Não é possível ligar <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Esta aplicação não é compatível com uma VPN sempre ativada."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">Mostrar %d item oculto</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Rede e Internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivos ligados"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplicações e notificações"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Utilizador e contas"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Predefinições da aplicação"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Definições"</string>
     <string name="search_menu" msgid="6283419262313758339">"Definições de pesquisa"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Definições de pesquisa"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Subst. sons perfil de trab.?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Substituir"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Os sons atuais do seu perfil de trabalho serão substituídos pelos sons do seu perfil pessoal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurar notificações"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferências de notificação"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avançadas"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificações de trabalho"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Usar luz de notificações"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Terça-feira às 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Terça-feira às 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Terça-feira às 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Ver tudo"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ver menos"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desligado"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> dos dados utilizados"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 0cb1232..072e344 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Desconectar"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versão <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Esquecer VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Substituir VPN já existente?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Você já está conectado a uma VPN. Caso se conecte a uma diferente, a VPN já existente será substituída."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Substituir VPN já existente?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Configurar VPN sempre ativa?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Se você ativar esta configuração, sua conexão com a Internet não estará disponível até que a VPN se conecte"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Sua VPN já existente será substituída, e você não terá uma conexão com a Internet até que a VPN se conecte"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Você já está conectado a uma VPN sempre ativa. Caso se conecte a uma diferente, a VPN já existente será substituída, e o modo sempre ativo será desativado."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Você já está conectado a uma VPN. Caso se conecte a uma diferente, a VPN já existente será substituída."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Ativar"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Não é possível conectar-se a <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Este app não é compatível com VPN sempre ativa."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">Mostrar %d item oculto</item>
       <item quantity="other">Mostrar %d itens ocultos</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Rede e Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispositivos conectados"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Apps e notificações"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Usuário e contas"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Padrões de apps"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Configurações"</string>
     <string name="search_menu" msgid="6283419262313758339">"Configurações de pesquisa"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Configurações de pesquisa"</string>
@@ -2627,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Substituir sons do perfil de trabalho?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Substituir"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Os sons atuais do seu perfil de trabalho serão substituídos pelos sons do seu perfil pessoal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurar notificações"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferências de notificação"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avançadas"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificações de trabalho"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulsar luz de notificação"</string>
@@ -3033,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Ter 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Ter 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Ter 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Ver tudo"</string>
-    <string name="see_less" msgid="1250265310929558370">"Ver menos"</string>
     <string name="disconnected" msgid="5787956818111197212">"Desconectado"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> de dados usados"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 0e0e3e8..e985ebe 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -2297,8 +2297,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Deconectați-vă"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versiunea <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Eliminați profilul VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Înlocuiți rețeaua VPN existentă?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"V-ați conectat deja la o rețea VPN. Dacă vă conectați la altă rețea, rețeaua VPN existentă va fi înlocuită."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Înlocuiți rețeaua VPN existentă?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Setați rețeaua VPN ca activată permanent?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Dacă activați această setare, nu veți avea conexiune la internet până când nu se conectează rețeaua VPN."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Rețeaua VPN existentă va fi înlocuită și nu veți avea conexiune la internet până când nu se conectează rețeaua VPN."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"V-ați conectat deja la o rețea VPN activată permanent. Dacă vă conectați la altă rețea, rețeaua VPN existentă va fi înlocuită și modul activat permanent va fi dezactivat."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"V-ați conectat deja la o rețea VPN. Dacă vă conectați la altă rețea, rețeaua VPN existentă va fi înlocuită."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Activați"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Nu vă puteți conecta la <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Această aplicație nu acceptă rețele VPN activate permanent."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2545,8 +2550,11 @@
       <item quantity="one">Afișați %d element ascuns</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Rețea și internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Dispozitive conectate"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplicații și notificări"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Utilizator și conturi"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Setări prestabilite ale aplicației"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Limba: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Setări"</string>
     <string name="search_menu" msgid="6283419262313758339">"Setări de căutare"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Setări pentru căutare"</string>
@@ -2648,7 +2656,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Înlocuiți sunetele profilului de serviciu?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Înlocuiți"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Sunetele actuale ale profilului de serviciu vor fi înlocuite cu cele ale profilului personal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Configurați notificările"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Preferințe privind notificările"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Avansate"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Notificări profil de serviciu"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Indicator luminos intermitent"</string>
@@ -2693,7 +2701,7 @@
     <string name="no_vr_listeners" msgid="2689382881717507390">"Nicio aplicație instalată nu a solicitat să fie rulată ca un serviciu de ajutor pentru Realitatea virtuală."</string>
     <string name="vr_listener_security_warning_title" msgid="8309673749124927122">"Permiteți accesul la serviciul de Realitate virtuală pentru <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
     <string name="vr_listener_security_warning_summary" msgid="6931541068825094653">"<xliff:g id="VR_LISTENER_NAME">%1$s</xliff:g> va putea rula când folosiți aplicațiile în modul de realitate virtuală."</string>
-    <string name="display_vr_pref_title" msgid="8104485269504335481">"Când dispozitivul este în modul VR"</string>
+    <string name="display_vr_pref_title" msgid="8104485269504335481">"Când dispozitivul este în modul RV"</string>
     <string name="display_vr_pref_low_persistence" msgid="5707494209944718537">"Reduceți estomparea (recomandat)"</string>
     <string name="display_vr_pref_off" msgid="2190091757123260989">"Reduceți pâlpâirea"</string>
     <string name="manage_zen_access_title" msgid="2611116122628520522">"Accesul Nu deranja"</string>
@@ -3062,8 +3070,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Marți, la 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Marți, la 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Marți, la 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Afișați-le pe toate"</string>
-    <string name="see_less" msgid="1250265310929558370">"Afișați mai puține"</string>
     <string name="disconnected" msgid="5787956818111197212">"Deconectată"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Date folosite: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index e669210..1d9273c 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -475,6 +475,6 @@
   <string-array name="automatic_storage_management_days">
     <item msgid="687318592238852312">"Добавленные более 30 дней назад"</item>
     <item msgid="2900554746706302178">"Добавленные более 60 дней назад"</item>
-    <item msgid="5692284879054004388">"Добавленные более 60 дней назад"</item>
+    <item msgid="5692284879054004388">"Добавленные более 90 дней назад"</item>
   </string-array>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 4db3539..957b13d 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -959,7 +959,7 @@
     <string name="night_display_category_schedule" msgid="2044072617637348966">"Расписание"</string>
     <string name="night_display_category_status" msgid="1952928783124400330">"Статус"</string>
     <string name="night_display_auto_mode_title" msgid="8046314360381608455">"Включать автоматически"</string>
-    <string name="night_display_auto_mode_never" msgid="6723636142053240947">"Всегда выключать"</string>
+    <string name="night_display_auto_mode_never" msgid="6723636142053240947">"Никогда"</string>
     <string name="night_display_auto_mode_custom" msgid="6012300346981608242">"Мое расписание"</string>
     <string name="night_display_auto_mode_twilight" msgid="2123345097508167094">"От заката до рассвета"</string>
     <string name="night_display_start_time_title" msgid="8918016772613689584">"Время включения"</string>
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Да"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Версия <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Удалить VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Сменить существующую сеть VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Вы уже подключены. Если вы подключитесь к другой сети, текущая VPN-сеть будет заменена."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Сменить текущую VPN-сеть?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Настроить постоянную VPN-сеть?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Если включить эту настройку, доступ к Интернету появится только после подключения к VPN."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Вы замените текущую VPN-сеть, а доступ к Интернету появится только после подключения к новой сети."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Вы уже подключены к постоянной VPN-сети. Если выбрать другую сеть, режим постоянного подключения будет сброшен."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Вы уже подключены. Если вы подключитесь к другой VPN-сети, то замените текущую."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Включить"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Не удалось подключиться к сети \"<xliff:g id="VPN_NAME">%1$s</xliff:g>\""</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Это приложение не поддерживает постоянное подключение к VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"Настройки VPN"</string>
@@ -2566,10 +2571,14 @@
       <item quantity="many">Показать %d скрытых объектов</item>
       <item quantity="other">Показать %d скрытых объекта</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Сеть и Интернет"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Подключенные устройства"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Приложения и уведомления"</string>
+    <!-- no translation found for account_dashboard_title (38701889336378742) -->
     <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
+    <!-- no translation found for app_default_dashboard_title (8176215295082796426) -->
     <skip />
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Язык: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Настройки"</string>
     <string name="search_menu" msgid="6283419262313758339">"Поиск настроек"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Поиск настроек"</string>
@@ -2671,7 +2680,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Изменить настройки?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Да"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Сигналы в рабочем профиле будут заменены звуками, выбранными в личном."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Настройка уведомлений"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Расширенные настройки"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Рабочие уведомления"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Световой индикатор"</string>
@@ -3093,8 +3103,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Вт, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Вт, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Вт, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Показать все"</string>
-    <string name="see_less" msgid="1250265310929558370">"Скрыть"</string>
     <string name="disconnected" msgid="5787956818111197212">"Нет подключения"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Использовано трафика: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 3e6def6..6817259 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -2282,8 +2282,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"විසන්ධි කරන්න"</string>
     <string name="vpn_version" msgid="1939804054179766249">"අනුවාදය <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN අමතක කරන්න"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"පවතින VPN ප්‍රතිස්ථාපනය කරන්නද?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"ඔබට දැනටමත් VPN එකකට සම්බන්ධය. ඔබ වෙනත් එකකට සබැඳුණහොත්, ඔබේ පවතින VPN ප්‍රතිස්ථාපනය වනු ඇත."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"පවතින VPN ප්‍රතිස්ථාපනය කරන්නද?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"සැම විට ක්‍රියාත්මක VPN සකසන්නද?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"මෙම සැකසීම ක්‍රියාත්මක කිරීමෙන්, ඔබට VPN සාර්ථකව සම්බන්ධ වන තෙක් අන්තර්ජාල සබැඳුමක් නොතිබෙනු ඇත"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"ඔබේ පවතින VPN ප්‍රතිස්ථාපනය වනු ඇති අතර, ඔබට VPN සාර්ථකව සම්බන්ධ වන තෙක් අන්තර්ජාල සබැඳුමක් නොතිබෙනු ඇත"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"ඔබට දැනටමත් සැම විට ක්‍රියාත්මක VPN එකකට සම්බන්ධය. ඔබ වෙනත් එකකට සම්බන්ධ වුවහොත්, ඔබේ පවතින VPN ප්‍රතිස්ථාපනය වනු ඇති අතර, සැම විට ක්‍රියාත්මක ප්‍රකාරය ක්‍රියාවිරහිත වනු ඇත."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"ඔබට දැනටමත් VPN එකකට සම්බන්ධය. ඔබ වෙනත් එකකට සබැඳුණහොත්, ඔබේ පවතින VPN ප්‍රතිස්ථාපනය වනු ඇත."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ක්‍රියාත්මක කරන්න"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> හට සම්බන්ධ විය නොහැකිය"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"මෙම යෙදුම සැම විට ක්‍රියාත්මක VPN සඳහා සහාය නොදක්වයි."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2525,8 +2530,11 @@
       <item quantity="other">සඟවන ලද අයිතම %dක් පෙන්වන්න</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"ජාලය සහ අන්තර්ජාලය"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"සම්බන්ධ කළ උපාංග"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"යෙදුම් සහ දැනුම්දීම්"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"පරිශීලක සහ ගිණුම්"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"යෙදුම් පෙරනිමි"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"භාෂාව: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"සැකසීම්"</string>
     <string name="search_menu" msgid="6283419262313758339">"සැකසීම් සොයන්න"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"සැකසීම් සොයන්න"</string>
@@ -2628,7 +2636,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"කා. පැතිකඩ හඩ ප්‍රතිස්ථා. කර.?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"ප්‍රතිස්ථාපනය කරන්න"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"ඔබේ වත්මන් කාර්යාල පැතිකඩ හඬවල් ඔබේ පුද්ගලික පැතිකඩ හඬවල්වලින් ප්‍රතිස්ථාපනය වනු ඇත"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"දැනුම්දීම් වින්‍යාස කිරීම"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"උසස්"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"වැඩ දැනුම්දීම්"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ස්පන්ද දැනුම්දීම් එළිය"</string>
@@ -3034,8 +3043,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"අඟ ප.ව. 6:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"අඟ ප.ව. 6:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"අඟ ප.ව. 6:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"සියල්ල බලන්න"</string>
-    <string name="see_less" msgid="1250265310929558370">"අඩුවෙන් බලන්න"</string>
     <string name="disconnected" msgid="5787956818111197212">"විසන්ධි වුණි"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"දත්තවලින් <xliff:g id="AMOUNT">%1$s</xliff:g>ක් ස්ථාපනය කරන ලදී"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 3ee888f..eb09dae 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Odpojiť"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Verzia <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Zabudnúť profil VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Nahradiť existujúce VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"K sieti VPN ste sa už pripojili. Ak sa pripojíte k inej sieti, vaša súčasná sieť VPN bude nahradená."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Nahradiť existujúcu sieť VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Nastaviť sieť VPN, ktorá je vždy zapnutá?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ak zapnete toto nastavenie, nebudete mať internetové pripojenie, dokým nedôjde k úspešnému nadviazaniu pripojenia VPN"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Vaša súčasná sieť VPN bude nahradená a nebudete mať internetové pripojenie, dokým nedôjde k úspešnému nadviazaniu pripojenia VPN"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"K sieti VPN, ktorá je vždy zapnutá, ste sa už pripojili. Ak sa pripojíte k inej sieti, vaša súčasná sieť VPN bude nahradená a vypne sa režim vždy zapnutej siete."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"K sieti VPN ste sa už pripojili. Ak sa pripojíte k inej sieti, vaša súčasná sieť VPN bude nahradená."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Zapnúť"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> nie je možné pripojiť"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Táto aplikácia nepodporuje siete VPN, ktoré sú vždy zapnuté."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2566,10 +2571,12 @@
       <item quantity="other">Zobraziť %d skrytých položiek</item>
       <item quantity="one">Zobraziť %d skrytú položku</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Sieť a internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Pripojené zariadenia"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikácie a upozornenia"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Používateľ a účty"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Predvolené aplikácie"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Jazyk: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Nastavenia"</string>
     <string name="search_menu" msgid="6283419262313758339">"Nastavenia vyhľadávania"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Nastavenia vyhľadávania"</string>
@@ -2671,7 +2678,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Nahradiť zvuky prac. profilu?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Nahradiť"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Vaše súčasné zvuky pracovného profilu budú nahradené zvukmi osobného profilu"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurácia upozornení"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Predvoľby upozornení"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Rozšírené"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Pracovné upozornenia"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Blikať kontrolkou upozornenia"</string>
@@ -3093,8 +3100,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Ut 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Ut 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Ut 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Zobraziť všetko"</string>
-    <string name="see_less" msgid="1250265310929558370">"Zobraziť menej"</string>
     <string name="disconnected" msgid="5787956818111197212">"Odpojené"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Objem využitých dát: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 43fddc8..74a7027 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Prekini povezavo"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Različica <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Pozabi omrežje VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Želite zamenjati obstoječe omrežje VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Z omrežjem VPN ste že povezani. Če se povežete z drugim, bo obstoječe omrežje VPN zamenjano."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Želite zamenjati obstoječe omrežje VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Ali želite, da je omrežje VPN stalno vklopljeno?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Če vklopite to nastavitev, ne boste imeli internetne povezave, dokler se ne vzpostavi povezava z omrežjem VPN."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Vaše obstoječe omrežje VPN bo zamenjano in ne boste imeli internetne povezave, dokler se ne vzpostavi povezava z omrežjem VPN."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"S stalno vklopljenim omrežjem VPN ste že povezani. Če se povežete z drugim, bo obstoječe omrežje VPN zamenjano in stalno vklopljeni način se bo izklopil."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Z omrežjem VPN ste že povezani. Če se povežete z drugim, bo obstoječe omrežje VPN zamenjano."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Vklopi"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Z omrežjem VPN <xliff:g id="VPN_NAME">%1$s</xliff:g> ni mogoče vzpostaviti povezave."</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ta aplikacija ne podpira stalno vklopljenih omrežij VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2566,10 +2571,12 @@
       <item quantity="few">Pokaži %d skrite elemente</item>
       <item quantity="other">Pokaži %d skritih elementov</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Omrežje in internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Povezane naprave"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikacije in obvestila"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Uporabnik in računi"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Privzete aplikacije"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Nastavitve"</string>
     <string name="search_menu" msgid="6283419262313758339">"Nastavitve iskanja"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Nastavitve iskanja"</string>
@@ -2671,7 +2678,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Zamenj. zvokov v del. profilu?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Zamenjaj"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Trenutne zvoke v delovnem profilu bodo nadomestili zvoki iz osebnega profila"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfiguriranje obvestil"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Dodatno"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Obvestila za delovni profil"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Lučka za obvestila z utripanjem"</string>
@@ -3093,8 +3101,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Tor., 18.01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Tor., 18.02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Tor., 18.03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Pokaži vse"</string>
-    <string name="see_less" msgid="1250265310929558370">"Pokaži manj"</string>
     <string name="disconnected" msgid="5787956818111197212">"Povezava prekinjena"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Prenesenih podatkov: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index bfb0248..b6538c1 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Shkëpute"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Versioni <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Harroje rrjetin VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Të zëvendësohet rrjeti ekzistues VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Je tashmë i lidhur me një rrjet VPN. Nëse je lidhur me një tjetër, rrjeti yt ekzistues VPN do të zëvendësohet."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Të zëvendësohet rrjeti ekzistues VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Të caktohet rrjeti VPN gjithmonë aktiv?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Duke aktivizuar këtë cilësim, nuk do të kesh një lidhje interneti deri sa rrjeti VPN të lidhet me sukses"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Rrjeti yt ekzistues VPN do të zëvendësohet dhe nuk do të kesh një lidhje interneti deri sa rrjeti VPN të lidhet me sukses"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Je tashmë i lidhur me një rrjet VPN gjithmonë aktiv. Nëse je lidhur me një tjetër, rrjeti yt ekzistues VPN do të zëvendësohet dhe modaliteti gjithmonë aktiv do të çaktivizohet."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Je tashmë i lidhur me një rrjet VPN. Nëse je lidhur me një tjetër, rrjeti yt ekzistues VPN do të zëvendësohet."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktivizo"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> nuk mund të lidhet"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ky aplikacion nuk mbështet VPN-në që është gjithmonë aktive."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Shfaq %d artikuj të fshehur</item>
       <item quantity="one">Shfaq %d artikull të fshehur</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Rrjeti dhe interneti"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Pajisje të lidhura"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aplikacionet dhe njoftimet"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Përdoruesi dhe llogaritë"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Parazgjedhjet e aplikacionit"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Gjuha: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Cilësimet"</string>
     <string name="search_menu" msgid="6283419262313758339">"Cilësimet e kërkimit"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Cilësimet e kërkimit"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Të zëvendësohen tingujt e profilit të punës?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Zëvendëso"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Tingujt aktualë të profilit tënd të punës do të zëvendësohen me tingujt e profilit tënd personal"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfiguro njoftimet"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Të përparuara"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Njoftimet e punës"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulso dritën e njoftimeve"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"E martë 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"E martë 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"E martë 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Shikoji të gjitha"</string>
-    <string name="see_less" msgid="1250265310929558370">"Shiko më pak"</string>
     <string name="disconnected" msgid="5787956818111197212">"E shkëputur"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> nga të dhënat janë përdorur"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 6719d16..bd31527 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -2297,8 +2297,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Прекини везу"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Верзија <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Заборави VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Желите ли да замените постојећи VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Већ сте повезани са VPN-ом. Када бисте се повезали са неким другим VPN-ом, постојећи VPN би био замењен."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Желите ли да замените постојећи VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Желите ли да подесите увек укључени VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ако укључите ово подешавање, нећете имати интернет везу док се VPN не повеже"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Постојећи VPN ће бити замењен и нећете имати интернет везу док се VPN не повеже"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Већ сте повезани са увек укљученим VPN-ом. Ако се повежете са неким другим, постојећи VPN ће бити замењен, а режим Увек укључен ће бити искључен."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Већ сте повезани са VPN-ом. Ако се повежете са неким другим, постојећи VPN ће бити замењен."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Укључи"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Повезивање са VPN-ом <xliff:g id="VPN_NAME">%1$s</xliff:g> није успело"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ова апликација не подржава стално укључени VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2545,8 +2550,11 @@
       <item quantity="other">Прикажи %d скривених ставки</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Мрежа и интернет"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Повезани уређаји"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Aпликације и обавештења"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Корисник и налози"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Подразумеване апликације"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Језик: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Подешавања"</string>
     <string name="search_menu" msgid="6283419262313758339">"Претражите подешавања"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Подешавања претраге"</string>
@@ -2648,7 +2656,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Заменити звуке профилa за Work?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Замени"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Актуелни звуци профилa за Work ће бити замењени звуцима са личног профила"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Конфигуришите обавештења"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Подешавања обавештења"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Напредна"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Обавештења за Work"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Пулсирајуће обавештење"</string>
@@ -3062,8 +3070,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Уто 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Уто 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Уто 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Прикажи све"</string>
-    <string name="see_less" msgid="1250265310929558370">"Прикажи мање"</string>
     <string name="disconnected" msgid="5787956818111197212">"Веза је прекинута"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Користи се <xliff:g id="AMOUNT">%1$s</xliff:g> података"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index ba7a09f..944ecc7 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Koppla från"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Version <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Glöm VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Vill du byta ut befintligt VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Du är redan ansluten till ett VPN. Om du ansluter till ett annat ersätts ditt befintliga VPN."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Vill du byta ut befintligt VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Vill du ange Always-on VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Om du inaktiverar den här inställningen har du ingen internetanslutning förrän VPN är anslutet"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Ditt befintliga VPN ersätts, och du har ingen internetanslutning förrän VPN är anslutet."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Du är redan ansluten till ett Always-on VPN. Om du ansluter till ett annat ersätts ditt befintliga VPN, och Always-on-läge inaktiveras."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Du är redan ansluten till ett VPN. Om du ansluter till ett annat ersätts ditt befintliga VPN."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aktivera"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> kan inte ansluta"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Appen stöder inte Always-on VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Visa %d dolda objekt</item>
       <item quantity="one">Visa %d dolt objekt</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Nätverk och internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Anslutna enheter"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Appar och aviseringar"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Användare och konton"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Standardappar"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Språk: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Inställningar"</string>
     <string name="search_menu" msgid="6283419262313758339">"Sökinställningar"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Sökinställningar"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Ersätta jobbprofilljuden?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Ersätt"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"De nuvarande ljuden i jobbprofilen ersätts med dem i den personliga profilen."</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Konfigurera aviseringar"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Avancerat"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Jobbaviseringar"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Blinkande ljusavisering"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Tis. 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Tis. 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Tis. 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Visa alla"</string>
-    <string name="see_less" msgid="1250265310929558370">"Visa färre"</string>
     <string name="disconnected" msgid="5787956818111197212">"Frånkopplad"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> data används"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 49c1192..ed78c8d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -2286,8 +2286,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Kata muungnisho"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Toleo la <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Ondoa VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Ungependa kubadilisha VPN iliyopo?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Tayari umeunganishwa kwenye VPN. Ikiwa utaunganisha kwenye programu tofauti, programu hiyo itaondoa VPN iliyopo."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Ungependa kubadilisha VPN iliyopo?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Ungependa kuweka VPN iliyowashwa kila mara?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Kwa kuwasha mIpangilio hii, hutapata muunganisho wa Intaneti hadi VPN itakapounganishwa"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Programu itaondoa VPN iliyopo, na hutaweza kuwa na muunganisho wa Intaneti hadi  VPN itakapounganishwa"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Tayari umeunganisha kwenye VPN ambayo imewashwa kila mara. Ikiwa utaunganisha kwenye programu tofauti, programu hiyo itaondoa VPN iliyopo na kuzima hali ya imewashwa kila mara."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Tayari umeunganisha kwenye VPN. Ikiwa utaunganisha kwenye programu tofauti, programu hiyo itaondoa VPN iliyopo."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Washa"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Haiwezi kuunganisha <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Programu hii haitumii VPN iliyo katika hali ya kuwaka kila mara."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2529,8 +2534,11 @@
       <item quantity="one">Onyesha kipengee %d kilichofichwa</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Mtandao na Intaneti"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Vifaa vilivyounganishwa"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Programu na arifa"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Watumiaji na akaunti"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Chaguo-msingi za programu"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Lugha: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Mipangilio"</string>
     <string name="search_menu" msgid="6283419262313758339">"Mipangilio ya utafutaji"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Mipangilio ya utafutaji"</string>
@@ -2632,7 +2640,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Ungependa kubadilisha sauti za wasifu wako wa kazini?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Badilisha"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Sauti za wasifu wako wa sasa wa kazini zitabadilishwa na nafasi zao kuchuliwa na sauti za wasifu wako binafsi"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Arifa za kuweka mipangilio"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Mipangilio ya kina"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Arifa za kazini"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Arifu ya mwangaza wa palsi"</string>
@@ -3038,8 +3047,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Jumanne saa 12:01 jioni"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Jumanne saa 12:02 jioni"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Jumanne saa 12:03 jioni"</string>
-    <string name="see_all" msgid="8883901630052886984">"Angalia zote"</string>
-    <string name="see_less" msgid="1250265310929558370">"Angalia chache"</string>
     <string name="disconnected" msgid="5787956818111197212">"Imeondolewa"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ya data imetumika"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-sw400dp/dimens.xml b/res/values-sw400dp/dimens.xml
index 9c82d90..7ae4061 100755
--- a/res/values-sw400dp/dimens.xml
+++ b/res/values-sw400dp/dimens.xml
@@ -16,13 +16,10 @@
   -->
 
 <resources>
-    <dimen name="fingerprint_ring_radius">106dp</dimen>
-    <dimen name="fingerprint_animation_size">100dp</dimen>
-    <dimen name="fingerprint_progress_bar_size">220dp</dimen>
     <dimen name="fingerprint_enrolling_content_margin_top">56dp</dimen>
     <dimen name="fingerprint_in_app_indicator_size">176dp</dimen>
     <dimen name="fingerprint_find_sensor_graphic_size">240dp</dimen>
 
-    <dimen name="setup_fingerprint_ring_radius">92dp</dimen>
-    <dimen name="setup_fingerprint_progress_bar_size">192dp</dimen>
+    <dimen name="support_escalation_card_padding_start">56dp</dimen>
+    <dimen name="support_escalation_card_padding_end">56dp</dimen>
 </resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 2ce5f8e..bc20756 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"தொடர்பைத் துண்டி"</string>
     <string name="vpn_version" msgid="1939804054179766249">"பதிப்பு <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPNஐ நீக்கு"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"தற்போதுள்ள VPNஐ மாற்றியமைக்கவா?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"நீங்கள் ஏற்கனவே ஒரு VPN உடன் இணைத்துள்ளீர்கள். வேறொன்றுடன் இணைத்தால், அது தற்போதுள்ள VPNக்குப் பதிலாக மாற்றியமைக்கப்படும்."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"தற்போதுள்ள VPNஐ மாற்றியமைக்கவா?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"எப்போதும் இயங்கும் VPNஐ அமைக்கவா?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"இந்த அமைப்பை இயக்கினால், VPN இணைக்கப்படும் வரை இணைய இணைப்பு கிடைக்காது"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"தற்போதுள்ள VPN மாற்றியமைக்கப்படும், மேலும் VPN இணைக்கப்படும் வரை இணைய இணைப்பு கிடைக்காது"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"எப்போதும் இயங்கும் VPN உடன் ஏற்கனவே இணைத்துள்ளீர்கள். வேறொன்றுடன் இணைத்தால், அது தற்போதுள்ள VPNக்குப் பதிலாக மாற்றியமைக்கப்படும், மேலும் எப்போதும் இயங்கும் பயன்முறை முடக்கப்படும்."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"ஏற்கனவே ஒரு VPN உடன் இணைத்துள்ளீர்கள். வேறொன்றுடன் இணைத்தால், அது தற்போதுள்ள VPNக்குப் பதிலாக மாற்றியமைக்கப்படும்."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"இயக்கு"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g>ஐ இணைக்க முடியாது"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"இந்தப் பயன்பாடு எப்போதும் இயங்கும் VPNஐ ஆதரிக்கவில்லை."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">மறைந்துள்ள %d உருப்படிகளைக் காட்டு</item>
       <item quantity="one">மறைந்துள்ள %d உருப்படியைக் காட்டு</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"நெட்வொர்க் &amp; இணையம்"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"இணைத்த சாதனங்கள்"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"பயன்பாடுகள் &amp; அறிவிப்புகள்"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"பயனர் &amp; கணக்குகள்"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"பயன்பாட்டின் இயல்புகள்"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"மொழி: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"அமைப்பு"</string>
     <string name="search_menu" msgid="6283419262313758339">"தேடல் அமைப்புகள்"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"தேடல் அமைப்பு"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"பணி விவர ஒலிகளை மாற்றவா?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"மாற்று"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"உங்கள் பணி விவர ஒலிகளானது தனிப்பட்ட சுயவிவர ஒலிகளாக மாற்றப்படும்"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"அறிவிப்புகளை உள்ளமை"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"மேம்பட்டவை"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"பணி அறிவிப்புகள்"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"தொடர் அறிவிப்பு விளக்கு"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"செவ் 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"செவ் 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"செவ் 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"எல்லாம் காட்டு"</string>
-    <string name="see_less" msgid="1250265310929558370">"குறைவாகக் காட்டு"</string>
     <string name="disconnected" msgid="5787956818111197212">"துண்டிக்கப்பட்டது"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> தரவு பயன்படுத்தப்பட்டுள்ளது"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index b3a66c2..67449fe 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"డిస్‌కనెక్ట్ చేయి"</string>
     <string name="vpn_version" msgid="1939804054179766249">"సంస్కరణ <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPNని విస్మరించు"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"ఇప్పటికే ఉన్న VPNని భర్తీ చేయాలా?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"మీరు ఇప్పటికే VPNకి కనెక్ట్ అయ్యారు. మీరు వేరొక దానికి కనెక్ట్ చేస్తే, మీకు ఇప్పటికే ఉన్న VPN భర్తీ చేయబడుతుంది."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"ఇప్పటికే ఉన్న VPNని భర్తీ చేయాలా?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"ఎల్లప్పుడూ ఆన్‌లో ఉండే VPNని సెట్ చేయాలా?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"ఈ సెట్టింగ్‌ను ఆన్ చేస్తే, VPN విజయవంతంగా కనెక్ట్ అయ్యే వరకు మీకు ఇంటర్నెట్ కనెక్షన్ ఉండదు"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"ఇప్పటికే ఉన్న మీ VPN భర్తీ చేయబడుతుంది మరియు VPN విజయవంతంగా కనెక్ట్ అయ్యే వరకు మీకు ఇంటర్నెట్ కనెక్షన్ ఉండదు"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"మీరు ఇప్పటికే ఎల్లప్పుడూ ఆన్‌లో ఉండే VPNకి కనెక్ట్ అయ్యారు. మీరు వేరొక దానికి కనెక్ట్ చేస్తే, ఇప్పటికే ఉన్న మీ VPN భర్తీ చేయబడుతుంది మరియు ఎల్లప్పుడూ ఆన్‌లో ఉంచే మోడ్ ఆఫ్ చేయబడుతుంది."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"మీరు ఇప్పటికే VPNకి కనెక్ట్ అయ్యారు. మీరు వేరొక దానికి కనెక్ట్ చేస్తే, మీ ప్రస్తుత VPN భర్తీ చేయబడుతుంది."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"ఆన్ చేయి"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g>కి కనెక్ట్ కావడం సాధ్యపడదు"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"ఈ అనువర్తనం ఎల్లప్పుడూ ఆన్‌లో ఉండే VPNకు మద్దతివ్వదు."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2523,8 +2528,11 @@
       <item quantity="one">%d దాచబడిన అంశాన్ని చూపుతుంది</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"నెట్‌వర్క్ &amp; ఇంటర్నెట్"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"కనెక్ట్ చేసిన పరికరాలు"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"అనువర్తనాలు &amp; నోటిఫికేషన్‌లు"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"వినియోగదారు &amp; ఖాతాలు"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"అనువర్తన డిఫాల్ట్‌లు"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"భాష: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"సెట్టింగ్‌లు"</string>
     <string name="search_menu" msgid="6283419262313758339">"శోధన సెట్టింగ్‌లు"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"శోధన సెట్టింగ్‌లు"</string>
@@ -2626,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"కార్యాలయ ప్రొఫైల్ శబ్దాలు భర్తీ చేయాలా?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"భర్తీ చేయి"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"మీ ప్రస్తుత కార్యాలయ ప్రొఫైల్ శబ్దాలు మీ వ్యక్తిగత ప్రొఫైల్ శబ్దాలతో భర్తీ చేయబడతాయి"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"నోటిఫికేషన్‌లను కాన్ఫిగర్ చేయి"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"అధునాతనం"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"కార్యాలయ నోటిఫికేషన్‌లు"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"నోటిఫికేషన్ లైట్‌ను మిణుకుమిణుకుమనేలా చేయి"</string>
@@ -3032,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"మంగళ 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"మంగళ 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"మంగళ 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"అన్నీ చూడండి"</string>
-    <string name="see_less" msgid="1250265310929558370">"తక్కువ చూడండి"</string>
     <string name="disconnected" msgid="5787956818111197212">"డిస్‌కనెక్ట్ చేయబడింది"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> డేటా ఉపయోగించబడింది"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 48dc1e0..04c903d 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"ยกเลิกการเชื่อมต่อ"</string>
     <string name="vpn_version" msgid="1939804054179766249">"เวอร์ชัน <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"ลืม VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"แทนที่ VPN ที่มีอยู่ไหม"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"คุณเชื่อมต่ออยู่กับ VPN แล้ว หากคุณเชื่อมต่อรายการอื่น ระบบจะแทนที่ VPN ที่มีอยู่"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"แทนที่ VPN ที่มีอยู่หรือไม่"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"ตั้งค่า VPN แบบเปิดตลอดเวลาหรือไม่"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"เมื่อเปิดการตั้งค่านี้ คุณจะไม่มีการเชื่อมต่ออินเทอร์เน็ตจนกว่า VPN จะเชื่อมต่อสำเร็จ"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"ระบบจะแทนที่ VPN ที่มีอยู่และคุณจะไม่มีการเชื่อมต่ออินเทอร์เน็ตจนกว่า VPN จะเชื่อมต่อสำเร็จ"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"คุณเชื่อมต่ออยู่กับ VPN แบบเปิดตลอดเวลาแล้ว หากเชื่อมต่อรายการอื่น ระบบจะแทนที่ VPN ที่มีอยู่และปิดโหมดเปิดตลอดเวลา"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"คุณเชื่อมต่ออยู่กับ VPN แล้ว หากเชื่อมต่อรายการอื่น ระบบจะแทนที่ VPN ที่มีอยู่"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"เปิด"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ไม่สามารถเชื่อมต่อได้"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"แอปนี้ไม่สนับสนุน VPN ที่เปิดอยู่เสมอ"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">แสดงรายการที่ซ่อน %d รายการ</item>
       <item quantity="one">แสดงรายการที่ซ่อน %d รายการ</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"เครือข่ายและอินเทอร์เน็ต"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"อุปกรณ์ที่เชื่อมต่อ"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"แอปและการแจ้งเตือน"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"ผู้ใช้และบัญชี"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ค่าเริ่มต้นของแอป"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"ภาษา: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"การตั้งค่า"</string>
     <string name="search_menu" msgid="6283419262313758339">"การตั้งค่าการค้นหา"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"การตั้งค่าการค้นหา"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"เปลี่ยนเสียงในโปรไฟล์งานไหม"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"แทนที่"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"ระบบจะใช้เสียงในโปรไฟล์ส่วนตัวของคุณแทนเสียงในโปรไฟล์งานปัจจุบัน"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"กำหนดค่าการแจ้งเตือน"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"ขั้นสูง"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"การแจ้งเตือนงาน"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"ไฟกระพริบแจ้งเตือน"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"อังคาร 18.01 น."</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"อังคาร 18.02 น."</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"อังคาร 18.03 น."</string>
-    <string name="see_all" msgid="8883901630052886984">"ดูทั้งหมด"</string>
-    <string name="see_less" msgid="1250265310929558370">"ดูน้อยลง"</string>
     <string name="disconnected" msgid="5787956818111197212">"ยกเลิกการเชื่อมต่อแล้ว"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"ใช้อินเทอร์เน็ตไป <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index ef5bd80..0363928 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Putulin ang koneksyon"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Bersyon <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Kalimutan ang VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Palitan ang dati nang VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Nakakonekta ka na sa isang VPN. Kung kokonekta ka sa iba, papalitan ang dati mo nang VPN."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Gusto mo bang palitan ang dati nang VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Gusto mo bang itakda ang VPN na palaging naka-on?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Kapag na-on ang setting na ito, wala kang magagamit na koneksyon sa Internet hanggang sa matagumpay na makakonekta ang VPN"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Papalitan ang dati mo nang VPN at wala kang magagamit na koneksyon sa Internet hanggang sa matagumpay na makakonekta ang VPN"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Nakakonekta ka na sa isang VPN na palaging naka-on. Kung kokonekta ka sa iba, papalitan ang dati mo nang VPN at io-off ang palaging naka-on na mode."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Nakakonekta ka na sa isang VPN. Kung kokonekta ka sa iba, papalitan ang dati mo nang VPN."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"I-on"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Hindi makakonekta ang <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Hindi sinusuportahan ng app na ito ang VPN na palaging naka-on."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="one">Ipakita ang %d nakatagong item</item>
       <item quantity="other">Ipakita ang %d na nakatagong item</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Network at Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Mga nakakonektang device"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Mga app at notification"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"User at mga account"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Mga default na app"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Wika: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Mga Setting"</string>
     <string name="search_menu" msgid="6283419262313758339">"Mga setting ng paghahanap"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Mga setting ng paghahanap"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Palitan tunog sa profile sa trabaho?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Palitan"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Papalitan ang kasalukuyang mga tunog sa profile sa trabaho ng mga tunog sa iyong personal na profile"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"I-configure ang mga notification"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Advanced"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Mga notification sa trabaho"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Pulse na ilaw ng notification"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Mar 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Mar 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Mar 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"Tingnan lahat"</string>
-    <string name="see_less" msgid="1250265310929558370">"Tumingin nang kaunti"</string>
     <string name="disconnected" msgid="5787956818111197212">"Naputol ang Koneksyon"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ng data ang ginamit"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 466e807..6e36df6 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Bağlantıyı kes"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Sürüm <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPN\'yi unut"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Mevcut VPN değiştirilsin mi?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Bir VPN\'ye zaten bağlısınız. Farklı bir VPN\'ye bağlanırsanız mevcut VPN\'niz değiştirilecek."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Mevcut VPN değiştirilsin mi?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Her zaman açık VPN ayarlansın mı?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Bu ayarı açtığınızda VPN doğru bir şekilde bağlanana kadar İnternet bağlantınız olmayacak."</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Mevcut VPN\'niz değiştirilecek ve VPN başarıyla bağlanana kadar İnternet bağlantınız olmayacak."</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Her zaman açık moddaki VPN\'ye zaten bağlısınız. Farklı bir VPN\'ye bağlanırsanız mevcut VPN\'niz değişir ve her zaman açık modu kapanır."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Bir VPN\'ye zaten bağlısınız. Farklı bir VPN\'ye bağlanırsanız mevcut VPN\'niz değiştirilecek."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Aç"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> bağlantısı yapılamıyor"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Bu uygulama her zaman açık durumda olan VPN\'yi desteklemez."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Gizli %d öğeyi göster</item>
       <item quantity="one">Gizli %d öğeyi göster</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Ağ ve İnternet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Bağlı cihazlar"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Uygulamalar ve bildirimler"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Kullanıcı ve hesaplar"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Uygulama varsayılanları"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Dil: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Ayarlar"</string>
     <string name="search_menu" msgid="6283419262313758339">"Arama ayarları"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Arama ayarları"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"İş profili seslerini değiştir?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Değiştir"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Mevcut iş profili sesleriniz kişisel profil seslerinizle değiştirilecek"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Bildirimleri yapılandır"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Gelişmiş"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"İş bildirimleri"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Bildirim ışığını yakıp söndür"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Sal 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Sal 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Sal 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Tümünü göster"</string>
-    <string name="see_less" msgid="1250265310929558370">"Daha az göster"</string>
     <string name="disconnected" msgid="5787956818111197212">"Bağlantı kesildi"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> veri kullanıldı"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 029e8f1..d531bc5 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -2314,8 +2314,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Відключити"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Версія <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Забути мережу VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Замінити наявну мережу VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Пристрій уже під’єднано до мережі VPN. Якщо під’єднати його до іншої мережі, наявну мережу VPN буде замінено."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Замінити наявну мережу VPN?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Увімкнути постійну мережу VPN?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Якщо ввімкнути це налаштування, пристрій не матиме з’єднання з Інтернетом, доки не під’єднається мережа VPN"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Наявну мережу VPN буде замінено, а пристрій не матиме з’єднання з Інтернетом, доки не під’єднається мережа VPN"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Пристрій уже під’єднано до постійної мережі VPN. Якщо під’єднати його до іншої мережі, наявну мережу VPN буде замінено, а режим постійної мережі VPN буде вимкнено."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Пристрій уже під’єднано до мережі VPN. Якщо під’єднати його до іншої мережі, наявну мережу VPN буде замінено."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Увімкнути"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"Не вдається під’єднатися до мережі <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Цей додаток не підтримує постійну мережу VPN."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2567,8 +2572,11 @@
       <item quantity="other">Показати %d схованого елемента</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Мережа й Інтернет"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Під’єднані пристрої"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Додатки та сповіщення"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Користувач і облікові записи"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Додатки за умовчанням"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Мова: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Налаштування"</string>
     <string name="search_menu" msgid="6283419262313758339">"Налаштування пошуку"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Налаштуваня пошуку"</string>
@@ -2670,7 +2678,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Замінити звуки робоч. профілю?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Замінити"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Поточні звуки робочого профілю буде замінено на звуки особистого профілю"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Налаштування сповіщень"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Налаштування сповіщень"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Розширені налаштування"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Робочі сповіщення"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Світловий сигнал"</string>
@@ -3092,8 +3100,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Вт 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Вт 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Вт 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Показати все"</string>
-    <string name="see_less" msgid="1250265310929558370">"Показати менше"</string>
     <string name="disconnected" msgid="5787956818111197212">"Від’єднано"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Використовується трафіку: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index a1f8577..23c01e6 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -2270,8 +2270,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"غیر منسلک کریں"</string>
     <string name="vpn_version" msgid="1939804054179766249">"ورژن <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"‏VPN بھول جائیں"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"‏موجودہ VPN بدلیں؟"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"‏آپ پہلے سے VPN سے منسلک ہیں۔ اگر آپ کسی مختلف سے منسلک ہوتے ہیں تو آپ کا موجودہ VPN بدل دیا جائے گا۔"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"‏موجودہ VPN بدلیں؟"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"‏ہمیشہ آن VPN سیٹ کریں؟"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"‏اس ترتیب کو آن کرنے سے، آپ کے پاس تب تک انٹرنیٹ کنکشن نہیں ہو گا جب تک VPN کامیابی کے ساتھ منسلک نہیں ہو جاتا"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"‏آپ کا موجودہ VPN بدل دیا جائے گا اور آپ کے پاس تب تک انٹرنیٹ کنکشن نہیں ہو گا جب تک VPN کامیابی کے ساتھ منسلک نہیں ہو جاتا"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"‏آپ پہلے سے ایک ہمیشہ آن VPN سے منسلک ہیں۔ اگر آپ کسی مختلف سے منسلک ہوتے ہیں تو آپ کا موجودہ VPN بدل دیا جائے گا اور ہمیشہ آن موڈ آف ہو جائے گا۔"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"‏آپ پہلے سے VPN سے منسلک ہیں۔ اگر آپ کسی مختلف سے منسلک ہوتے ہیں تو آپ کا موجودہ VPN بدل دیا جائے گا۔"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"آن کریں"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> منسلک نہیں ہو سکتا"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"‏یہ ایپ ہمیشہ آن VPN کو سپورٹ نہیں کرتی۔"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2510,10 +2515,12 @@
     <string name="dashboard_title" msgid="5453710313046681820">"ترتیبات"</string>
     <!-- String.format failed for translation -->
     <!-- no translation found for settings_suggestion_header_summary_hidden_items (5597356221942118048) -->
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"نیٹ ورک اور انٹرنیٹ"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"منسلک آلات"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"ایپس اور اطلاعات"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"صارف اور اکاؤنٹس"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"ایپ ڈیفالٹس"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"زبان: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"ترتیبات"</string>
     <string name="search_menu" msgid="6283419262313758339">"تلاش کی ترتیبات"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"تلاش کی ترتیبات"</string>
@@ -2615,7 +2622,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"دفتری پروفائل کی آوازیں بدلیں؟"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"بدلیں"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"آپ کی موجودہ دفتری پروفائل کی آوازیں آپ کی ذاتی پروفائل کی آوازوں سے تبدیل ہو جائیں گی۔"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"اطلاعات کنفیگر کریں"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"جدید ترین"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"دفتری اطلاعات"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"پلس اطلاعی روشنی"</string>
@@ -3021,8 +3029,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"منگل 6:01 بجے رات"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"منگل 6:02 بجے رات"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"منگل 6:03 بجے رات"</string>
-    <string name="see_all" msgid="8883901630052886984">"سبھی دیکھیں"</string>
-    <string name="see_less" msgid="1250265310929558370">"کم دیکھیں"</string>
     <string name="disconnected" msgid="5787956818111197212">"غیر منسلک ہے"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> ڈیٹا استعمال ہو گیا"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index f91c669..a1ae883 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Aloqani uzish"</string>
     <string name="vpn_version" msgid="1939804054179766249">"<xliff:g id="VERSION">%s</xliff:g> versiya"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"VPNni o‘chirish"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Mavjud VPN tarmog‘i almashtirilsinmi?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Allaqachon VPN tarmog‘iga ulangan. Yangisiga ulansangiz, mavjud tarmoq almashtiriladi."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Mavjud VPN tarmog‘i almashtirilsinmi?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Doimiy VPN o‘rnatilsinmi?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Bu sozlama yoqilganda to VPN to‘liq ulanmaguncha internet ishlamaydi"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"Mavjud VPN tarmog‘i almashtiriladi va to VPN to‘liq ulanmaguncha internet ishlamaydi"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Doimiy VPN tarmog‘iga allaqachon ulangansiz. Agar boshqasiga ulansangiz, mavjud VPN tarmog‘i almashtiriladi va doimiy rejim o‘chirib qo‘yiladi."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Allaqachon VPN tarmog‘iga ulangan. Yangisiga ulansangiz, mavjud tarmoq almashtiriladi."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Yoqish"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"“<xliff:g id="VPN_NAME">%1$s</xliff:g>” tarmog‘iga ulanib bo‘lmadi"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Bu ilova doimiy VPN tarmog‘iga ulanishni qo‘llab-quvvatlamaydi."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,9 +2527,12 @@
       <item quantity="other">%d ta yashirin elementni ko‘rsatish</item>
       <item quantity="one">%d ta yashirin elementni ko‘rsatish</item>
     </plurals>
-    <string name="network_dashboard_title" msgid="4771589228992391573">"Tarmoq va internet"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Tarmoq va Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Ulangan qurilmalar"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Ilova va bildirishnomalar"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Foydalanuvchi va hisoblar"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Birlamchi ilovalar"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Til: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Sozlamalar"</string>
     <string name="search_menu" msgid="6283419262313758339">"Qidiruv sozlamalari"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Qidiruv sozlamalari"</string>
@@ -2626,7 +2634,7 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Ishchi ovozlar almashtirilsinmi?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Almashtirish"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Joriy ishchi profil ovozlari shaxsiy profil ovozlari bilan almashtiriladi"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Bildirishnomalarni sozlash"</string>
+    <string name="configure_notification_settings" msgid="7447797716856573587">"Bildirishnoma sozlamalari"</string>
     <string name="advanced_section_header" msgid="8833934850242546903">"Kengaytirilgan sozlamalar"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Ishga oid bildirishnomalar"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Yoritkichli indikator"</string>
@@ -3032,8 +3040,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Seshanba, 18:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Seshanba, 18:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Seshanba, 18:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"Hammasini ko‘rsatish"</string>
-    <string name="see_less" msgid="1250265310929558370">"Kamroq"</string>
     <string name="disconnected" msgid="5787956818111197212">"Aloqa uzildi"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Sarflangan trafik: <xliff:g id="AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index a80021a..4536626 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Ngắt kết nối"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Phiên bản <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Quên VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Thay thế VPN hiện có?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Bạn đã kết nối với một VPN. Nếu bạn kết nối với một VPN khác, VPN hiện có của bạn sẽ bị thay thế."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Thay thế VPN hiện có?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Đặt VPN luôn bật?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Bằng cách bật cài đặt này, bạn sẽ không có kết nối Internet cho đến khi VPN kết nối thành công"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"VPN hiện có của bạn sẽ được thay thế và bạn sẽ không có kết nối Internet cho đến khi VPN kết nối thành công"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Bạn đã kết nối với một VPN luôn bật. Nếu bạn kết nối với một VPN khác, VPN hiện có của bạn sẽ bị thay thế và chế độ luôn bật sẽ tắt."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Bạn đã kết nối với một VPN. Nếu bạn kết nối với một VPN khác, VPN hiện có của bạn sẽ bị thay thế."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Bật"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> không thể kết nối"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Ứng dụng này không hỗ trợ VPN luôn bật."</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">Hiển thị %d mục ẩn</item>
       <item quantity="one">Hiển thị %d mục ẩn</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"Mạng và Internet"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Thiết bị đã kết nối"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Ứng dụng và thông báo"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Người dùng và tài khoản"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Mặc định của ứng dụng"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Ngôn ngữ: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Cài đặt"</string>
     <string name="search_menu" msgid="6283419262313758339">"Cài đặt tìm kiếm"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Cài đặt tìm kiếm"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Thay thế âm thanh hồ sơ công việc?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Thay thế"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Âm thanh hồ sơ công việc hiện tại của bạn sẽ được thay thế bằng âm thanh hồ sơ cá nhân của bạn"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Định cấu hình thông báo"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Nâng cao"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Thông báo công việc"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Đèn thông báo dạng xung"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Thứ Ba 6:01 CH"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Thứ Ba 6:02 CH"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Thứ Ba 6:03 CH"</string>
-    <string name="see_all" msgid="8883901630052886984">"Xem tất cả"</string>
-    <string name="see_less" msgid="1250265310929558370">"Xem bớt"</string>
     <string name="disconnected" msgid="5787956818111197212">"Đã ngắt kết nối"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"Đã sử dụng <xliff:g id="AMOUNT">%1$s</xliff:g> dữ liệu"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 0659350..174a314 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -2280,8 +2280,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"断开连接"</string>
     <string name="vpn_version" msgid="1939804054179766249">"版本 <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"取消保存 VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"替换现有 VPN?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"您已连接到 VPN。如果要连接到其他 VPN,则系统将替换现有 VPN。"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"要替换现有 VPN 吗?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"要设置始终开启的 VPN 吗?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"开启这项设置后,在 VPN 成功连接之前,您将无法连接到互联网"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"系统将替换现有 VPN,而且在 VPN 成功连接之前,您将无法连接到互联网"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"您已连接到某个始终开启的 VPN。如果您要连接到其他 VPN,则系统将替换现有 VPN,并关闭始终开启模式。"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"您已连接到 VPN。如果您要连接到其他 VPN,则系统将替换现有 VPN。"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"开启"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"无法连接到<xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"此应用不支持始终开启的 VPN。"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2522,10 +2527,12 @@
       <item quantity="other">显示 %d 项隐藏内容</item>
       <item quantity="one">显示 %d 项隐藏内容</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"网络和互联网"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"已关联的设备"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"应用和通知"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"用户和帐号"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"应用默认设置"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"语言:<xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"设置"</string>
     <string name="search_menu" msgid="6283419262313758339">"搜索设置"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"搜索设置"</string>
@@ -2627,7 +2634,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"要替换工作资料提示音吗?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"替换"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"系统将使用您的个人资料提示音替换您当前的工作资料提示音"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"配置通知"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"高级"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"工作通知"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"收到通知时指示灯闪烁"</string>
@@ -3033,8 +3041,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"周二下午 6:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"周二下午 6:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"周二下午 6:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"查看全部"</string>
-    <string name="see_less" msgid="1250265310929558370">"隐藏部分"</string>
     <string name="disconnected" msgid="5787956818111197212">"已断开连接"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"已使用 <xliff:g id="AMOUNT">%1$s</xliff:g> 的数据"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 70ccbbf..ef69d2f 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -2285,8 +2285,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"中斷連線"</string>
     <string name="vpn_version" msgid="1939804054179766249">"版本為:<xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"刪除 VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"要取代現有的 VPN 嗎?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"您已連接至 VPN。如果您連接至另一個 VPN,目前的 VPN 將會被取代。"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"要取代目前的 VPN 嗎?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"要設定永遠開啟的 VPN 嗎?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"開啟此設定後,VPN 成功連線前,您將無法連線至互聯網"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"目前的 VPN 將會被取代,而 VPN 成功連線前,您將無法連線至互聯網"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"您已連線至永遠開啟的 VPN。如果您連線至另一個 VPN,目前的 VPN 將會被取代,而永遠開啟模式亦將會關閉。"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"您已連線至 VPN。如果您連線至另一個 VPN,目前的 VPN 將會被取代。"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"開啟"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"無法連接 <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"此應用程式不支援永遠開啟的 VPN。"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2527,10 +2532,12 @@
       <item quantity="other">顯示 %d 個隱藏項目</item>
       <item quantity="one">顯示 %d 個隱藏項目</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"網絡和互聯網"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"已連結的裝置"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"應用程式和通知"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"使用者和帳戶"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"應用程式預設"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"語言:<xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"設定"</string>
     <string name="search_menu" msgid="6283419262313758339">"搜尋設定"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"搜尋設定"</string>
@@ -2632,7 +2639,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"要取代工作設定檔聲音嗎?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"取代"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"目前的工作設定檔聲音會以個人設定檔聲音取代"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"設定通知"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"進階"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"工作通知"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"啟用通知燈"</string>
@@ -3038,8 +3046,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"星期二下午 6:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"星期二下午 6:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"星期二下午 6:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"顯示全部"</string>
-    <string name="see_less" msgid="1250265310929558370">"顯示較少"</string>
     <string name="disconnected" msgid="5787956818111197212">"已中斷連線"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"已使用 <xliff:g id="AMOUNT">%1$s</xliff:g> 數據"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 17c3237..98565de 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -2284,8 +2284,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"中斷連線"</string>
     <string name="vpn_version" msgid="1939804054179766249">"版本 <xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"清除 VPN 設定檔"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"要取代現有的 VPN 嗎?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"您已連線至某個 VPN。連線至其他 VPN 將會取代現有的 VPN。"</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"要取代現有的 VPN 嗎?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"要設定永久連線的 VPN 嗎?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"開啟這項設定後,在 VPN 成功連線之前,你將無法連上網際網路"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"現有的 VPN 會遭到取代,而且在 VPN 成功連線之前,你將無法連上網際網路"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"你已連線至特定的永久連線 VPN。連線至其他 VPN 將會取代現有的 VPN,並關閉永久連線模式。"</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"你已連線至特定 VPN。連線至其他 VPN 將會取代現有的 VPN。"</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"開啟"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"無法連線至 <xliff:g id="VPN_NAME">%1$s</xliff:g>"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"這個應用程式不支援永久連線的 VPN。"</string>
     <string name="vpn_title" msgid="6317731879966640551">"VPN"</string>
@@ -2526,10 +2531,12 @@
       <item quantity="other">顯示 %d 個隱藏項目</item>
       <item quantity="one">顯示 %d 個隱藏項目</item>
     </plurals>
-    <!-- no translation found for network_dashboard_title (4771589228992391573) -->
-    <skip />
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="network_dashboard_title" msgid="4771589228992391573">"網路和網際網路"</string>
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"已連結的裝置"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"應用程式和通知"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"使用者和帳戶"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"預設應用程式"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"語言:<xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"設定"</string>
     <string name="search_menu" msgid="6283419262313758339">"搜尋設定"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"搜尋設定"</string>
@@ -2631,7 +2638,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"要取代 Work 設定檔音效嗎?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"取代"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"你的個人設定檔音效將取代目前的 Work 設定檔音效"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"設定通知"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"進階"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Work 通知"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"閃爍燈光通知"</string>
@@ -3037,8 +3045,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"週二下午 6:01"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"週二下午 6:02"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"週二下午 6:03"</string>
-    <string name="see_all" msgid="8883901630052886984">"全部顯示"</string>
-    <string name="see_less" msgid="1250265310929558370">"顯示較少"</string>
     <string name="disconnected" msgid="5787956818111197212">"已中斷連線"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"已使用 <xliff:g id="AMOUNT">%1$s</xliff:g>的數據用量"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 6f7ca7b..b82f64a 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -2281,8 +2281,13 @@
     <string name="vpn_disconnect" msgid="7426570492642111171">"Nqamula"</string>
     <string name="vpn_version" msgid="1939804054179766249">"Inguqulo engu-<xliff:g id="VERSION">%s</xliff:g>"</string>
     <string name="vpn_forget_long" msgid="2232239391189465752">"Khohlwa i-VPN"</string>
-    <string name="vpn_replace_always_on_vpn_title" msgid="3010435028275752220">"Miselela i-VPN ekhona?"</string>
-    <string name="vpn_replace_always_on_vpn_message" msgid="4764679857158814028">"Usuvele uxhumekile ku-VPN. Uma uxhua kwehlukile, i-VPN izomiselelwa."</string>
+    <string name="vpn_replace_vpn_title" msgid="2963898301277610248">"Shintshanisa i-VPN ekhona?"</string>
+    <string name="vpn_set_vpn_title" msgid="4009987321156037267">"Setha i-VPN ehlala ivuliwe?"</string>
+    <string name="vpn_first_always_on_vpn_message" msgid="3025322109743675467">"Ngokuvula lesi silungiselelo, ngeke ube nokuxhumeka kwe-inthanethi kuze kuxhumeke i-VPN ngempumelelo"</string>
+    <string name="vpn_replace_always_on_vpn_enable_message" msgid="2577928591361606641">"I-VPN yakho ekhona izoshintshaniswa, futhi ngeke ube nokuxhumeka kwe-inthanethi i-VPN ize ixhumeke ngempumelelo"</string>
+    <string name="vpn_replace_always_on_vpn_disable_message" msgid="3011818750025879902">"Usuvele uxhumeke ku-VPN ehlala ivuliwe. Uma uxhumeka kwehlukile, i-VPN yakho ekhona izoshintshaniswa, futhi imodi yokuhlala ivuliwe izovalwa."</string>
+    <string name="vpn_replace_vpn_message" msgid="5611635724578812860">"Usuvele uxhumekile ku-VPN. Uma uxhua kwehlukile, i-VPN izoshintshaniswa."</string>
+    <string name="vpn_turn_on" msgid="2363136869284273872">"Vula"</string>
     <string name="vpn_cant_connect_title" msgid="4517706987875907511">"<xliff:g id="VPN_NAME">%1$s</xliff:g> ayikwazi ukuxhuma"</string>
     <string name="vpn_cant_connect_message" msgid="2593197919352621279">"Lolu hlelo lokusebenza alisekeli i-VPN ehlala ivulekile."</string>
     <string name="vpn_title" msgid="6317731879966640551">"I-VPN"</string>
@@ -2524,8 +2529,11 @@
       <item quantity="other">Bonisa izinto ezingu-%d ezifihliwe</item>
     </plurals>
     <string name="network_dashboard_title" msgid="4771589228992391573">"Inethiwekhi ye-inthanethi"</string>
-    <!-- no translation found for connected_devices_dashboard_title (2355264951438890709) -->
-    <skip />
+    <string name="connected_devices_dashboard_title" msgid="2355264951438890709">"Amadivayisi axhunyiwe"</string>
+    <string name="app_and_notification_dashboard_title" msgid="7838365599185397539">"Izinhlelo zokusebenza nezaziso"</string>
+    <string name="account_dashboard_title" msgid="38701889336378742">"Umsebenzisi nama-akhawunti"</string>
+    <string name="app_default_dashboard_title" msgid="8176215295082796426">"Okuzenzakalelayo kohlelo lokusebenza"</string>
+    <string name="system_dashboard_summary" msgid="6112602136713843779">"Ulimi: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string>
     <string name="search_results_title" msgid="1796252422574886932">"Izilungiselelo"</string>
     <string name="search_menu" msgid="6283419262313758339">"Izilungiselelo zokusesha"</string>
     <string name="query_hint_text" msgid="3350700807437473939">"Izilungiselelo zokusesha"</string>
@@ -2627,7 +2635,8 @@
     <string name="work_sync_dialog_title" msgid="4235493986362911084">"Faka esikhundleni imisindo yephrofayela yomsebenzi?"</string>
     <string name="work_sync_dialog_yes" msgid="7243884940551635717">"Buyisela"</string>
     <string name="work_sync_dialog_message" msgid="1655410601622810837">"Imisindo yakho yamanje yephrofayela yomsebenzi izoshintshaniswa nemisindo yakho siqu yephrofayela"</string>
-    <string name="configure_notification_settings" msgid="3558846607192693233">"Lungisa izaziso"</string>
+    <!-- no translation found for configure_notification_settings (7447797716856573587) -->
+    <skip />
     <string name="advanced_section_header" msgid="8833934850242546903">"Okuthuthukisiwe"</string>
     <string name="profile_section_header" msgid="2320848161066912001">"Izaziso zomsebenzi"</string>
     <string name="notification_pulse_title" msgid="1247988024534030629">"Ukukhanya kwesaziso sephalsi"</string>
@@ -3033,8 +3042,6 @@
     <string name="screen_zoom_conversation_timestamp_2" msgid="7107225702890747588">"Lwesibili 6:01PM"</string>
     <string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Lwesibili 6:02PM"</string>
     <string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Lwesibili 6:03PM"</string>
-    <string name="see_all" msgid="8883901630052886984">"Buka konke"</string>
-    <string name="see_less" msgid="1250265310929558370">"Buka okuncane"</string>
     <string name="disconnected" msgid="5787956818111197212">"Inqamukile"</string>
     <string name="data_usage_summary_format" msgid="7507047900192160585">"<xliff:g id="AMOUNT">%1$s</xliff:g> wedatha esetshenzisiwe"</string>
     <plurals name="notification_summary" formatted="false" msgid="4019451362120557382">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 2b6a730..3be4038 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -21,7 +21,7 @@
 
     <color name="material_empty_color_light">#FFCED7DB</color>
 
-
+    <color name="bluetooth_dialog_text_color">#8a000000</color>
 
     <color name="crypt_keeper_clock_background">#ff9a9a9a</color>
     <color name="crypt_keeper_clock_foreground">#ff666666</color>
@@ -53,8 +53,6 @@
     <color name="fingerprint_title_area_bg">?android:attr/colorAccent</color>
     <color name="fingerprint_title_color">#ffffffff</color>
     <color name="fingerprint_message_color">#de000000</color>
-    <color name="fingerprint_progress_ring">?android:attr/colorAccent</color>
-    <color name="fingerprint_progress_ring_bg">#20000000</color>
     <color name="fingerprint_indicator_background_resting">#12000000</color>
 
     <color name="running_processes_system_ram">#ff384248</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 6d56e18..75d8697 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -52,17 +52,10 @@
     <string name="gesture_double_twist_sensor_name" translatable="false"></string>
     <string name="gesture_double_twist_sensor_vendor" translatable="false"></string>
 
-    <!-- Pickup sensor name and vendor used by gesture setting -->
-    <string name="gesture_pickup_sensor_name" translatable="false"></string>
-    <string name="gesture_pickup_sensor_vendor" translatable="false"></string>
-
     <!-- When true enable gesture setting. -->
     <bool name="config_gesture_settings_enabled">false</bool>
 
     <!-- If the Storage Manager settings are enabled. -->
     <bool name="config_storage_manager_settings_enabled">false</bool>
 
-    <!-- When true show double-tap gesture setting. -->
-    <bool name="config_gesture_double_tap_settings_enabled">false</bool>
-
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ba15a19..40f3f71 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -67,6 +67,7 @@
 
     <dimen name="captioning_preview_height">200dp</dimen>
 
+    <dimen name="ring_progress_bar_thickness">4dp</dimen>
     <dimen name="settings_side_margin">0dip</dimen>
 
     <!-- Weight of the left pane in a multi-pane preference layout. -->
@@ -221,8 +222,6 @@
     <dimen name="redaction_vertical_margins">8dp</dimen>
 
     <!-- Fingerprint -->
-    <dimen name="fingerprint_ring_radius">92dip</dimen>
-    <dimen name="fingerprint_ring_thickness">4dip</dimen>
     <dimen name="fingerprint_dot_radius">8dp</dimen>
     <dimen name="fingerprint_pulse_radius">50dp</dimen>
     <item name="fingerprint_sensor_location_fraction_x" type="fraction">50%</item>
@@ -233,15 +232,13 @@
     <dimen name="fingerprint_error_text_appear_distance">16dp</dimen>
     <dimen name="fingerprint_error_text_disappear_distance">-8dp</dimen>
     <dimen name="fingerprint_animation_size">88dp</dimen>
-    <dimen name="fingerprint_progress_bar_size">192dp</dimen>
+    <dimen name="fingerprint_progress_bar_max_size">220dp</dimen>
+    <dimen name="fingerprint_progress_bar_min_size">120dp</dimen>
     <dimen name="fingerprint_enrolling_content_margin_top">36dp</dimen>
     <dimen name="fingerprint_in_app_indicator_size">124dp</dimen>
     <dimen name="fingerprint_in_app_indicator_min_size">124dp</dimen>
     <dimen name="fingerprint_in_app_indicator_max_size">264dp</dimen>
 
-    <dimen name="setup_fingerprint_ring_radius">80dip</dimen>
-    <dimen name="setup_fingerprint_progress_bar_size">168dp</dimen>
-
     <dimen name="confirm_credentials_security_method_margin">48dp</dimen>
     <dimen name="confirm_credentials_layout_width">@dimen/match_parent</dimen>
     <dimen name="confirm_credentials_top_padding">0dp</dimen>
@@ -315,4 +312,8 @@
     <!-- Visible vertical space we want to show below password edittext field when ime is shown.
          The unit is sp as it is related to the text size of password requirement item. -->
     <dimen name="visible_vertical_space_below_password">20sp</dimen>
+
+    <!-- Padding for the escalation card in normal dimens -->
+    <dimen name="support_escalation_card_padding_start">40dp</dimen>
+    <dimen name="support_escalation_card_padding_end">40dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8e6336f..14b7899 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5929,6 +5929,13 @@
     <string name="network_dashboard_title">Network &amp; Internet</string>
     <!-- Title for setting tile leading to Connected devices settings [CHAR LIMIT=40]-->
     <string name="connected_devices_dashboard_title">Connected devices</string>
+    <!-- Title for setting tile leading to Apps & Notification settings [CHAR LIMIT=40]-->
+    <string name="app_and_notification_dashboard_title">Apps &amp; notifications</string>
+    <!-- Title for setting tile leading to User and accounts settings [CHAR LIMIT=40]-->
+    <string name="account_dashboard_title">User &amp; accounts</string>
+    <!-- Title for setting tile leading to App defaults (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">App defaults</string>
     <!-- Summary text for system preference tile, showing current display language of device [CHAR LIMIT=NONE]-->
     <string name="system_dashboard_summary">Language: <xliff:g id="language">%1$s</xliff:g></string>
 
@@ -6152,7 +6159,7 @@
 
 
     <!-- Configure Notifications Settings title. [CHAR LIMIT=30] -->
-    <string name="configure_notification_settings">Configure notifications</string>
+    <string name="configure_notification_settings">Notification preferences</string>
 
     <!-- Configure Notifications: Advanced section header [CHAR LIMIT=30] -->
     <string name="advanced_section_header">Advanced</string>
@@ -7281,11 +7288,6 @@
     <!-- Conversation message timestamp of the messaging app preview screen. [CHAR LIMIT=20] -->
     <string name="screen_zoom_conversation_timestamp_4">Tue 6:03PM</string>
 
-    <!-- Button to show all top-level settings items [CHAR LIMIT=20] -->
-    <string name="see_all">See all</string>
-    <!-- Button to show less top-level settings items [CHAR LIMIT=20] -->
-    <string name="see_less">See less</string>
-
     <!-- Wi-Fi state - Disconnected [CHAR LIMIT=NONE] -->
     <string name="disconnected">Disconnected</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 32c0b4d..0f957a8 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -435,8 +435,8 @@
         <item name="android:background">@color/card_background_grey</item>
         <item name="android:gravity">center</item>
         <item name="android:minHeight">368dp</item>
-        <item name="android:paddingStart">56dp</item>
-        <item name="android:paddingEnd">56dp</item>
+        <item name="android:paddingStart">@dimen/support_escalation_card_padding_start</item>
+        <item name="android:paddingEnd">@dimen/support_escalation_card_padding_end</item>
     </style>
 
     <style name="FingerprintHeaderStyle" parent="android:style/TextAppearance.Material.Subhead">
@@ -445,4 +445,11 @@
         <item name="android:lineSpacingMultiplier">1.2</item>
     </style>
 
+    <style name="RingProgressBarStyle" parent="android:style/Widget.Material.ProgressBar.Horizontal">
+        <item name="android:indeterminate">false</item>
+        <item name="android:max">10000</item>
+        <item name="android:mirrorForRtl">false</item>
+        <item name="android:progressDrawable">@drawable/ring_progress</item>
+    </style>
+
 </resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index b9f69cf..a5ff54a 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -16,8 +16,6 @@
 
 <resources>
     <attr name="fingerprint_layout_theme" format="reference" />
-    <attr name="fingerprint_progress_bar_size" format="reference|dimension" />
-    <attr name="fingerprint_ring_radius" format="reference|dimension" />
     <attr name="ic_menu_moreoverflow" format="reference" />
     <attr name="ic_wps" format="reference" />
     <attr name="setup_divider_color" format="reference" />
@@ -38,8 +36,6 @@
         <item name="android:windowBackground">?android:attr/colorBackground</item>
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="fingerprint_progress_bar_size">@dimen/setup_fingerprint_progress_bar_size</item>
-        <item name="fingerprint_ring_radius">@dimen/setup_fingerprint_ring_radius</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
         <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="setup_divider_color">@color/setup_divider_color_dark</item>
@@ -62,8 +58,6 @@
         <item name="android:windowBackground">?android:attr/colorBackground</item>
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="fingerprint_progress_bar_size">@dimen/setup_fingerprint_progress_bar_size</item>
-        <item name="fingerprint_ring_radius">@dimen/setup_fingerprint_ring_radius</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
         <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="setup_divider_color">@color/setup_divider_color_light</item>
@@ -123,6 +117,7 @@
 
     <style name="SetupWizardAccessibilitySwitchBarTheme" parent="ThemeOverlay.SwitchBar.Settings">
         <item name="switchBarBackgroundColor">@color/material_blue_500</item>
+        <item name="android:colorControlActivated">@android:color/white</item>
     </style>
 
     <!-- Theme with no local references, used by AccountPreferenceBase where we have to inflate
@@ -140,8 +135,6 @@
         <item name="*android:preferenceFragmentPaddingSide">@dimen/settings_side_margin</item>
 
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="fingerprint_progress_bar_size">@dimen/fingerprint_progress_bar_size</item>
-        <item name="fingerprint_ring_radius">@dimen/fingerprint_ring_radius</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_holo_dark</item>
         <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 405d5af..7b1af10 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -19,10 +19,12 @@
     xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
     android:key="applications_settings">
 
-    <PreferenceScreen
+    <Preference
         android:key="manage_perms"
         android:title="@string/app_permissions"
-        settings:keywords="@string/keywords_app_permissions" />
+        settings:keywords="@string/keywords_app_permissions">
+        <intent android:action="android.intent.action.MANAGE_PERMISSIONS"/>
+    </Preference>
 
     <PreferenceCategory
         android:title="@string/default_apps_title">
diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml
new file mode 100644
index 0000000..4aa109e
--- /dev/null
+++ b/res/xml/app_and_notification.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2016 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+
+    <Preference
+        android:key="manage_perms"
+        android:title="@string/app_permissions"
+        android:order="-130"
+        settings:keywords="@string/keywords_app_permissions">
+        <intent android:action="android.intent.action.MANAGE_PERMISSIONS"/>
+    </Preference>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/app_default_settings.xml b/res/xml/app_default_settings.xml
new file mode 100644
index 0000000..c6e56a1
--- /dev/null
+++ b/res/xml/app_default_settings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2016 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+
+    <Preference
+        android:key="assist_and_voice_input"
+        android:title="@string/assist_and_voice_input_title"
+        android:fragment="com.android.settings.applications.ManageAssist"
+        android:order="-20"/>
+
+    <com.android.settings.applications.DefaultBrowserPreference
+        android:key="default_browser"
+        android:title="@string/default_browser_title"
+        android:summary="@string/default_browser_title_none"
+        android:order="-19"/>
+
+    <com.android.settings.applications.DefaultHomePreference
+        android:key="default_home"
+        android:title="@string/home_app"
+        android:summary="@string/no_default_home"
+        settings:keywords="@string/keywords_home"
+        android:order="-18"/>
+
+    <com.android.settings.applications.DefaultPhonePreference
+        android:key="default_phone_app"
+        android:title="@string/default_phone_title"
+        settings:keywords="@string/keywords_default_phone_app"
+        android:order="-17"/>
+
+    <com.android.settings.applications.DefaultSmsPreference
+        android:key="default_sms_app"
+        android:title="@string/sms_application_title"
+        settings:keywords="@string/keywords_more_default_sms_app"
+        android:order="-16"/>
+
+    <com.android.settings.applications.DefaultEmergencyPreference
+        android:key="default_emergency_app"
+        android:title="@string/default_emergency_app"
+        settings:keywords="@string/keywords_emergency_app"
+        android:order="-15"/>
+
+    <Preference
+        android:key="domain_urls"
+        android:title="@string/domain_urls_title"
+        android:fragment="com.android.settings.applications.ManageDomainUrls">
+    </Preference>
+
+    <com.android.settings.WorkOnlyCategory
+        android:key="work_defaults"
+        android:title="@string/default_for_work">
+
+        <com.android.settings.applications.DefaultBrowserPreference
+            android:key="work_default_browser"
+            android:title="@string/default_browser_title"
+            android:summary="@string/default_browser_title_none"
+            settings:forWork="true"/>
+
+        <com.android.settings.applications.DefaultPhonePreference
+            android:key="work_default_phone_app"
+            android:title="@string/default_phone_title"
+            settings:keywords="@string/keywords_default_phone_app"
+            settings:forWork="true"/>
+
+    </com.android.settings.WorkOnlyCategory>
+
+    <Preference
+        android:key="special_access"
+        android:fragment="com.android.settings.applications.SpecialAccessSettings"
+        android:title="@string/special_access"/>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 8778abb..626cd33 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -15,19 +15,34 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
-        android:title="@string/configure_notification_settings"
-        android:key="configure_notification_settings" >
+                  android:title="@string/configure_notification_settings"
+                  android:key="configure_notification_settings">
 
     <!-- Pulse notification light -->
     <SwitchPreference
-            android:key="notification_pulse"
-            android:title="@string/notification_pulse_title" />
+        android:key="notification_pulse"
+        android:title="@string/notification_pulse_title"/>
 
     <!-- When device is locked -->
     <com.android.settings.notification.RestrictedDropDownPreference
-            android:key="lock_screen_notifications"
+        android:key="lock_screen_notifications"
+        android:title="@string/lock_screen_notifications_title"
+        android:summary="%s"/>
+
+    <SwitchPreference
+        android:key="gesture_swipe_down_fingerprint"
+        android:title="@string/fingerprint_swipe_for_notifications_title"
+        android:summary="@string/fingerprint_swipe_for_notifications_summary"/>
+
+    <PreferenceCategory
+        android:key="lock_screen_notifications_profile_header"
+        android:title="@string/profile_section_header">
+
+        <com.android.settings.notification.RestrictedDropDownPreference
+            android:key="lock_screen_notifications_profile"
             android:title="@string/lock_screen_notifications_title"
-            android:summary="%s" />
+            android:summary="%s"/>
+
+    </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/res/xml/configure_notification_settings_profile.xml b/res/xml/configure_notification_settings_profile.xml
deleted file mode 100644
index 301f3c0..0000000
--- a/res/xml/configure_notification_settings_profile.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
-        android:title="@string/configure_notification_settings" >
-
-    <PreferenceCategory
-            android:title="@string/profile_section_header" >
-
-        <com.android.settings.notification.RestrictedDropDownPreference
-            android:key="lock_screen_notifications_profile"
-            android:title="@string/lock_screen_notifications_title"
-            android:summary="%s" />
-
-    </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 06858b7..3a1f501 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -298,7 +298,11 @@
                 intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
                         mForFingerprint);
                 intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
-                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
+                startActivityForResult(
+                        intent,
+                        mIsSetNewPassword && mHasChallenge
+                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
+                                : ENABLE_ENCRYPTION_REQUEST);
             } else {
                 if (mForChangeCredRequiredForBoot) {
                     // Welp, couldn't change it. Oh well.
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 0ce61c7..2d40f20 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
+import android.app.admin.PasswordMetrics;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.InsetDrawable;
@@ -583,8 +584,8 @@
                 // The length requirements are fulfilled.
                 if (mRequestedQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX) {
                     // Check for repeated characters or sequences (e.g. '1234', '0000', '2468')
-                    final int sequence = LockPatternUtils.maxLengthSequence(password);
-                    if (sequence > LockPatternUtils.MAX_ALLOWED_SEQUENCE) {
+                    final int sequence = PasswordMetrics.maxLengthSequence(password);
+                    if (sequence > PasswordMetrics.MAX_ALLOWED_SEQUENCE) {
                         errorCode |= CONTAIN_SEQUENTIAL_DIGITS;
                     }
                 }
@@ -594,40 +595,22 @@
                 }
             }
 
-            // Count different types of character.
-            int letters = 0;
-            int numbers = 0;
-            int lowercase = 0;
-            int symbols = 0;
-            int uppercase = 0;
-            int nonletter = 0;
+            // Allow non-control Latin-1 characters only.
             for (int i = 0; i < password.length(); i++) {
                 char c = password.charAt(i);
-                // allow non control Latin-1 characters only
                 if (c < 32 || c > 127) {
                     errorCode |= CONTAIN_INVALID_CHARACTERS;
-                    continue;
-                }
-                if (c >= '0' && c <= '9') {
-                    numbers++;
-                    nonletter++;
-                } else if (c >= 'A' && c <= 'Z') {
-                    letters++;
-                    uppercase++;
-                } else if (c >= 'a' && c <= 'z') {
-                    letters++;
-                    lowercase++;
-                } else {
-                    symbols++;
-                    nonletter++;
+                    break;
                 }
             }
 
+            final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password);
+
             // Ensure no non-digits if we are requesting numbers. This shouldn't be possible unless
             // user finds some way to bring up soft keyboard.
             if (mRequestedQuality == PASSWORD_QUALITY_NUMERIC
                     || mRequestedQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX) {
-                if (letters > 0 || symbols > 0) {
+                if (metrics.letters > 0 || metrics.symbols > 0) {
                     errorCode |= CONTAIN_NON_DIGITS;
                 }
             }
@@ -637,32 +620,32 @@
                 int passwordRestriction = mPasswordRequirements[i];
                 switch (passwordRestriction) {
                     case MIN_LETTER_IN_PASSWORD:
-                        if (letters < mPasswordMinLetters) {
+                        if (metrics.letters < mPasswordMinLetters) {
                             errorCode |= NOT_ENOUGH_LETTER;
                         }
                         break;
                     case MIN_UPPER_LETTERS_IN_PASSWORD:
-                        if (uppercase < mPasswordMinUpperCase) {
+                        if (metrics.upperCase < mPasswordMinUpperCase) {
                             errorCode |= NOT_ENOUGH_UPPER_CASE;
                         }
                         break;
                     case MIN_LOWER_LETTERS_IN_PASSWORD:
-                        if (lowercase < mPasswordMinLowerCase) {
+                        if (metrics.lowerCase < mPasswordMinLowerCase) {
                             errorCode |= NOT_ENOUGH_LOWER_CASE;
                         }
                         break;
                     case MIN_SYMBOLS_IN_PASSWORD:
-                        if (symbols < mPasswordMinSymbols) {
+                        if (metrics.symbols < mPasswordMinSymbols) {
                             errorCode |= NOT_ENOUGH_SYMBOLS;
                         }
                         break;
                     case MIN_NUMBER_IN_PASSWORD:
-                        if (numbers < mPasswordMinNumeric) {
+                        if (metrics.numeric < mPasswordMinNumeric) {
                             errorCode |= NOT_ENOUGH_DIGITS;
                         }
                         break;
                     case MIN_NON_LETTER_IN_PASSWORD:
-                        if (nonletter < mPasswordMinNonLetter) {
+                        if (metrics.nonLetter < mPasswordMinNonLetter) {
                             errorCode |= NOT_ENOUGH_NON_LETTER;
                         }
                         break;
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 32aaaf0..b9bc439 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -1958,7 +1958,8 @@
             Settings.Global.putInt(getActivity().getContentResolver(),
                     Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
                     mKeepScreenOn.isChecked() ?
-                            (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);
+                            (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB
+                                    | BatteryManager.BATTERY_PLUGGED_WIRELESS) : 0);
         } else if (preference == mBtHciSnoopLog) {
             writeBtHciSnoopLogOptions();
         } else if (preference == mEnableOemUnlock && mEnableOemUnlock.isEnabled()) {
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 3305b98..24091e2 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -32,14 +32,13 @@
 import android.support.v7.preference.PreferenceGroup;
 import android.text.TextUtils;
 import android.util.Log;
-import android.widget.Toast;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController;
+import com.android.settings.deviceinfo.BuildNumberPreferenceController;
 import com.android.settings.deviceinfo.SystemUpdatePreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
 import com.android.settingslib.DeviceInfoUtils;
 import com.android.settingslib.RestrictedLockUtils;
@@ -59,7 +58,6 @@
     private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal";
     private static final String PROPERTY_SELINUX_STATUS = "ro.build.selinux";
     private static final String KEY_KERNEL_VERSION = "kernel_version";
-    private static final String KEY_BUILD_NUMBER = "build_number";
     private static final String KEY_DEVICE_MODEL = "device_model";
     private static final String KEY_SELINUX_STATUS = "selinux_status";
     private static final String KEY_BASEBAND_VERSION = "baseband_version";
@@ -70,20 +68,16 @@
     private static final String KEY_DEVICE_FEEDBACK = "device_feedback";
     private static final String KEY_SAFETY_LEGAL = "safetylegal";
 
-    static final int TAPS_TO_BE_A_DEVELOPER = 7;
 
     long[] mHits = new long[3];
-    int mDevHitCountdown;
-    Toast mDevHitToast;
     private SystemUpdatePreferenceController mSystemUpdatePreferenceController;
     private AdditionalSystemUpdatePreferenceController mAdditionalSystemUpdatePreferenceController;
+    private BuildNumberPreferenceController mBuildNumberPreferenceController;
 
     private UserManager mUm;
 
     private EnforcedAdmin mFunDisallowedAdmin;
     private boolean mFunDisallowedBySystem;
-    private EnforcedAdmin mDebuggingFeaturesDisallowedAdmin;
-    private boolean mDebuggingFeaturesDisallowedBySystem;
 
     @Override
     public int getMetricsCategory() {
@@ -96,6 +90,14 @@
     }
 
     @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (mBuildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
+            return;
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         final Activity activity = getActivity();
@@ -103,7 +105,9 @@
         mSystemUpdatePreferenceController = new SystemUpdatePreferenceController(activity, mUm);
         mAdditionalSystemUpdatePreferenceController =
                 new AdditionalSystemUpdatePreferenceController(activity);
-
+        mBuildNumberPreferenceController =
+                new BuildNumberPreferenceController(activity, activity, this /* fragment */);
+        getLifecycle().addObserver(mBuildNumberPreferenceController);
         addPreferencesFromResource(R.xml.device_info_settings);
 
         setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE);
@@ -119,8 +123,7 @@
         setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband");
         setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + DeviceInfoUtils.getMsvSuffix());
         setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID);
-        setStringSummary(KEY_BUILD_NUMBER, Build.DISPLAY);
-        findPreference(KEY_BUILD_NUMBER).setEnabled(true);
+        mBuildNumberPreferenceController.displayPreference(getPreferenceScreen());
         findPreference(KEY_KERNEL_VERSION).setSummary(DeviceInfoUtils.getFormattedKernelVersion());
 
         if (!SELinux.isSELinuxEnabled()) {
@@ -174,26 +177,21 @@
     @Override
     public void onResume() {
         super.onResume();
-        mDevHitCountdown = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
-                Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW,
-                        android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER;
-        mDevHitToast = null;
         mFunDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
                 getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
         mFunDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(
                 getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
-        mDebuggingFeaturesDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
-                getActivity(), UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
-        mDebuggingFeaturesDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(
-                getActivity(), UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
     }
 
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
+        if (mBuildNumberPreferenceController.handlePreferenceTreeClick(preference)) {
+            return true;
+        }
         if (preference.getKey().equals(KEY_FIRMWARE_VERSION)) {
-            System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);
-            mHits[mHits.length-1] = SystemClock.uptimeMillis();
-            if (mHits[0] >= (SystemClock.uptimeMillis()-500)) {
+            System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
+            mHits[mHits.length - 1] = SystemClock.uptimeMillis();
+            if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
                 if (mUm.hasUserRestriction(UserManager.DISALLOW_FUN)) {
                     if (mFunDisallowedAdmin != null && !mFunDisallowedBySystem) {
                         RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
@@ -212,59 +210,13 @@
                     Log.e(LOG_TAG, "Unable to start activity " + intent.toString());
                 }
             }
-        } else if (preference.getKey().equals(KEY_BUILD_NUMBER)) {
-            // Don't enable developer options for secondary users.
-            if (!mUm.isAdminUser()) return true;
-
-            // Don't enable developer options until device has been provisioned
-            if (!Utils.isDeviceProvisioned(getActivity())) {
+        } else if (preference.getKey().equals(KEY_SECURITY_PATCH)) {
+            if (getPackageManager().queryIntentActivities(preference.getIntent(), 0).isEmpty()) {
+                // Don't send out the intent to stop crash
+                Log.w(LOG_TAG, "Stop click action on " + KEY_SECURITY_PATCH + ": "
+                        + "queryIntentActivities() returns empty" );
                 return true;
             }
-
-            if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
-                if (mDebuggingFeaturesDisallowedAdmin != null &&
-                        !mDebuggingFeaturesDisallowedBySystem) {
-                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
-                            mDebuggingFeaturesDisallowedAdmin);
-                }
-                return true;
-            }
-
-            if (mDevHitCountdown > 0) {
-                mDevHitCountdown--;
-                if (mDevHitCountdown == 0) {
-                    getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
-                            Context.MODE_PRIVATE).edit().putBoolean(
-                                    DevelopmentSettings.PREF_SHOW, true).apply();
-                    if (mDevHitToast != null) {
-                        mDevHitToast.cancel();
-                    }
-                    mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_on,
-                            Toast.LENGTH_LONG);
-                    mDevHitToast.show();
-                    // This is good time to index the Developer Options
-                    Index.getInstance(
-                            getActivity().getApplicationContext()).updateFromClassNameResource(
-                                    DevelopmentSettings.class.getName(), true, true);
-
-                } else if (mDevHitCountdown > 0
-                        && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER-2)) {
-                    if (mDevHitToast != null) {
-                        mDevHitToast.cancel();
-                    }
-                    mDevHitToast = Toast.makeText(getActivity(), getResources().getQuantityString(
-                            R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown),
-                            Toast.LENGTH_SHORT);
-                    mDevHitToast.show();
-                }
-            } else if (mDevHitCountdown < 0) {
-                if (mDevHitToast != null) {
-                    mDevHitToast.cancel();
-                }
-                mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_already,
-                        Toast.LENGTH_LONG);
-                mDevHitToast.show();
-            }
         } else if (preference.getKey().equals(KEY_DEVICE_FEEDBACK)) {
             sendFeedback();
         }
@@ -272,7 +224,6 @@
         return super.onPreferenceTreeClick(preference);
     }
 
-
     private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup,
             String preference, String property ) {
         if (SystemProperties.get(property).equals("")) {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 5f90353..eb79c25 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -20,7 +20,6 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.FragmentManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -35,7 +34,6 @@
 import android.os.PersistableBundle;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.os.storage.StorageManager;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.security.KeyStore;
@@ -52,11 +50,14 @@
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.TrustAgentUtils.TrustAgentComponentInfo;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.fingerprint.FingerprintSettings;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
@@ -64,6 +65,9 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.RestrictedSwitchPreference;
+import com.android.settingslib.drawer.CategoryKey;
+import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.Tile;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -79,6 +83,7 @@
         GearPreference.OnGearClickListener {
 
     private static final String TAG = "SecuritySettings";
+
     private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent";
     private static final Intent TRUST_AGENT_INTENT =
             new Intent(TrustAgentService.SERVICE_INTERFACE);
@@ -125,6 +130,7 @@
 
     private static final int MY_USER_ID = UserHandle.myUserId();
 
+    private DashboardFeatureProvider mDashboardFeatureProvider;
     private DevicePolicyManager mDPM;
     private SubscriptionManager mSubscriptionManager;
     private UserManager mUm;
@@ -162,17 +168,22 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        mSubscriptionManager = SubscriptionManager.from(getActivity());
+        final Activity activity = getActivity();
 
-        mLockPatternUtils = new LockPatternUtils(getActivity());
+        mSubscriptionManager = SubscriptionManager.from(activity);
 
-        mManagedPasswordProvider = ManagedLockPasswordProvider.get(getActivity(), MY_USER_ID);
+        mLockPatternUtils = new LockPatternUtils(activity);
+
+        mManagedPasswordProvider = ManagedLockPasswordProvider.get(activity, MY_USER_ID);
 
         mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
 
-        mUm = UserManager.get(getActivity());
+        mUm = UserManager.get(activity);
 
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
+        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(activity);
+
+        mDashboardFeatureProvider = FeatureFactory.getFactory(activity)
+                .getDashboardFeatureProvider(activity);
 
         if (savedInstanceState != null
                 && savedInstanceState.containsKey(TRUST_AGENT_CLICK_INTENT)) {
@@ -399,6 +410,13 @@
         Index.getInstance(getActivity())
                 .updateFromClassNameResource(SecuritySettings.class.getName(), true, true);
 
+        final List<Preference> tilePrefs = getDynamicTilesForSecurity();
+        if (tilePrefs != null && !tilePrefs.isEmpty()) {
+            for (Preference preference : tilePrefs) {
+                root.addPreference(preference);
+            }
+        }
+
         for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) {
             final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]);
             if (pref != null) pref.setOnPreferenceChangeListener(this);
@@ -745,6 +763,31 @@
                 SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE, extras);
     }
 
+    private List<Preference> getDynamicTilesForSecurity() {
+        if (!mDashboardFeatureProvider.isEnabled()) {
+            return null;
+        }
+        final DashboardCategory category =
+                mDashboardFeatureProvider.getTilesForCategory(CategoryKey.CATEGORY_SECURITY);
+        if (category == null) {
+            Log.d(TAG, "NO dashboard tiles for " + TAG);
+            return null;
+        }
+        final List<Tile> tiles = category.tiles;
+        if (tiles == null) {
+            Log.d(TAG, "tile list is empty, skipping category " + category.title);
+            return null;
+        }
+        final List<Preference> preferences = new ArrayList<>();
+        for (Tile tile : tiles) {
+            final Preference pref = new Preference(getPrefContext());
+            mDashboardFeatureProvider
+                    .bindPreferenceToTile(getActivity(), pref, tile, null /* key */);
+            preferences.add(pref);
+        }
+        return preferences;
+    }
+
     @Override
     public boolean onPreferenceChange(Preference preference, Object value) {
         boolean result = true;
@@ -1053,7 +1096,6 @@
             if (root != null) {
                 root.removeAll();
             }
-            root = null;
 
             final int resid = getResIdForLockUnlockSubScreen(getActivity(),
                     new LockPatternUtils(getContext()),
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 91db7fa..451c7e3 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -166,7 +166,9 @@
     // Top level categories for new IA
     public static class NetworkDashboardActivity extends SettingsActivity {}
     public static class ConnectedDeviceDashboardActivity extends SettingsActivity {}
+    public static class AppAndNotificationDashboardActivity extends SettingsActivity {}
     public static class StorageDashboardActivity extends SettingsActivity {}
+    public static class UserAndAccountDashboardActivity extends SettingsActivity {}
     public static class SystemDashboardActivity extends SettingsActivity {}
     public static class SupportDashboardActivity extends SettingsActivity {}
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 07f6ebf..eff2004 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -61,7 +61,9 @@
 import com.android.settings.accounts.AccountSyncSettings;
 import com.android.settings.accounts.ChooseAccountActivity;
 import com.android.settings.accounts.ManagedProfileSettings;
+import com.android.settings.accounts.UserAndAccountDashboardFragment;
 import com.android.settings.applications.AdvancedAppSettings;
+import com.android.settings.applications.AppAndNotificationDashboardFragment;
 import com.android.settings.applications.DrawOverlayDetails;
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
@@ -272,22 +274,28 @@
             // New IA
             // Home page
             Settings.NetworkDashboardActivity.class.getName(),
+            Settings.ConnectedDeviceDashboardActivity.class.getName(),
+            Settings.AppAndNotificationDashboardActivity.class.getName(),
             "com.android.settings.Settings.BatteryDashboardAlias",
             "com.android.settings.Settings.DisplayDashboardAlias",
+            "com.android.settings.Settings.SoundDashboardAlias",
             "com.android.settings.Settings.SecurityDashboardAlias",
+            Settings.UserAndAccountDashboardActivity.class.getName(),
             Settings.SystemDashboardActivity.class.getName(),
             Settings.SupportDashboardActivity.class.getName(),
+            // Home page > Apps & Notifications
+            "com.android.settings.Settings.ManageApplicationsDashboardAlias",
+            "com.android.settings.Settings.PaymentSettingsDashboardAlias",
             // Home page > Network & Internet
             "com.android.settings.Settings.WifiDashboardAlias",
             "com.android.settings.Settings.DataUsageDashboardAlias",
-            // Home page > Connected devices
-            Settings.ConnectedDeviceDashboardActivity.class.getName(),
+            // Home page > Security
+            "com.android.settings.Settings.LocationDashboardAlias",
             // Home page > System
             "com.android.settings.Settings.LanguageAndInputDashboardAlias",
             "com.android.settings.Settings.DateTimeDashboardAlias",
             "com.android.settings.Settings.AccessibilityDashboardAlias",
             "com.android.settings.Settings.AboutDeviceDashboardAlias",
-
     };
 
     private static final String[] ENTRY_FRAGMENTS = {
@@ -392,6 +400,8 @@
             SystemDashboardFragment.class.getName(),
             NetworkDashboardFragment.class.getName(),
             ConnectedDeviceDashboardFragment.class.getName(),
+            AppAndNotificationDashboardFragment.class.getName(),
+            UserAndAccountDashboardFragment.class.getName(),
     };
 
 
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index f8520d8..6f4482c 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -47,7 +47,9 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.net.ConnectivityManager;
 import android.net.LinkProperties;
+import android.net.Network;
 import android.net.Uri;
+import android.net.wifi.WifiManager;
 import android.os.BatteryManager;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -235,10 +237,15 @@
      * @return the formatted and newline-separated IP addresses, or null if none.
      */
     public static String getWifiIpAddresses(Context context) {
-        ConnectivityManager cm = (ConnectivityManager)
+        WifiManager wifiManager = context.getSystemService(WifiManager.class);
+        Network currentNetwork = wifiManager.getCurrentNetwork();
+        if (currentNetwork != null) {
+            ConnectivityManager cm = (ConnectivityManager)
                 context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        LinkProperties prop = cm.getLinkProperties(ConnectivityManager.TYPE_WIFI);
-        return formatIpAddresses(prop);
+            LinkProperties prop = cm.getLinkProperties(currentNetwork);
+            return formatIpAddresses(prop);
+        }
+        return null;
     }
 
     /**
diff --git a/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java b/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
new file mode 100644
index 0000000..34d6dc4
--- /dev/null
+++ b/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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.accounts;
+
+import android.content.Context;
+
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.drawer.CategoryKey;
+
+import java.util.List;
+
+public class UserAndAccountDashboardFragment extends DashboardFragment {
+
+    private static final String TAG = "UserAndAccountDashboard";
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.ACCOUNT;
+    }
+
+    @Override
+    protected String getCategoryKey() {
+        return CategoryKey.CATEGORY_ACCOUNT;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.account_settings;
+    }
+
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index db9d8de..827b6e8 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2016 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.
@@ -15,57 +15,52 @@
  */
 package com.android.settings.applications;
 
-import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.Intent;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
-import com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.drawer.CategoryKey;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-public class AdvancedAppSettings extends SettingsPreferenceFragment implements
-        Indexable {
+public class AdvancedAppSettings extends DashboardFragment {
 
     static final String TAG = "AdvancedAppSettings";
 
-    private static final String KEY_APP_PERM = "manage_perms";
-    private static final String KEY_APP_DOMAIN_URLS = "domain_urls";
-    private static final String KEY_HIGH_POWER_APPS = "high_power_apps";
-    private static final String KEY_SYSTEM_ALERT_WINDOW = "system_alert_window";
-    private static final String KEY_WRITE_SETTINGS_APPS = "write_settings_apps";
-
-    private Preference mAppPermsPreference;
-    private Preference mAppDomainURLsPreference;
-    private Preference mHighPowerPreference;
-    private Preference mSystemAlertWindowPreference;
-    private Preference mWriteSettingsPreference;
-
-    private BroadcastReceiver mPermissionReceiver;
-
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        addPreferencesFromResource(R.xml.advanced_apps);
+    }
 
-        Preference permissions = getPreferenceScreen().findPreference(KEY_APP_PERM);
-        permissions.setIntent(new Intent(Intent.ACTION_MANAGE_PERMISSIONS));
+    @Override
+    protected String getCategoryKey() {
+        return CategoryKey.CATEGORY_APPS_DEFAULT;
+    }
 
-        mAppPermsPreference = findPreference(KEY_APP_PERM);
-        mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS);
-        mHighPowerPreference = findPreference(KEY_HIGH_POWER_APPS);
-        mSystemAlertWindowPreference = findPreference(KEY_SYSTEM_ALERT_WINDOW);
-        mWriteSettingsPreference = findPreference(KEY_WRITE_SETTINGS_APPS);
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return mDashboardFeatureProvider.isEnabled()
+                ? R.xml.app_default_settings
+                : R.xml.advanced_apps;
+    }
+
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        return null;
     }
 
     @Override
@@ -73,32 +68,16 @@
         return MetricsEvent.APPLICATIONS_ADVANCED;
     }
 
-    private final PermissionsResultCallback mPermissionCallback = new PermissionsResultCallback() {
-        @Override
-        public void onAppWithPermissionsCountsResult(int standardGrantedPermissionAppCount,
-                int standardUsedPermissionAppCount) {
-            if (getActivity() == null) {
-                return;
-            }
-            mPermissionReceiver = null;
-            if (standardUsedPermissionAppCount != 0) {
-                mAppPermsPreference.setSummary(getContext().getString(
-                        R.string.app_permissions_summary,
-                        standardGrantedPermissionAppCount,
-                        standardUsedPermissionAppCount));
-            } else {
-                mAppPermsPreference.setSummary(null);
-            }
-        }
-    };
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
                 public List<SearchIndexableResource> getXmlResourcesToIndex(
                         Context context, boolean enabled) {
-                    SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.advanced_apps;
+                    final SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = FeatureFactory.getFactory(context)
+                            .getDashboardFeatureProvider(context).isEnabled()
+                            ? R.xml.app_default_settings
+                            : R.xml.advanced_apps;
                     return Arrays.asList(sir);
                 }
 
diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
new file mode 100644
index 0000000..8630541
--- /dev/null
+++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016 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;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.drawer.CategoryKey;
+
+import java.util.List;
+
+public class AppAndNotificationDashboardFragment extends DashboardFragment {
+
+    private static final String TAG = "AppAndNotifDashboard";
+
+    @Override
+    public int getMetricsCategory() {
+        return APP_AND_NOTIFICATION_CATEGORY_FRAGMENT;
+    }
+
+    @Override
+    protected String getCategoryKey() {
+        return CategoryKey.CATEGORY_APPS;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.app_and_notification;
+    }
+
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        return null;
+    }
+}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index f868c1b..23242c7 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -74,6 +74,7 @@
 import com.android.settings.notification.ConfigureNotificationSettings;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settings.notification.NotificationBackend.AppRow;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -245,7 +246,8 @@
         }
         if (className.equals(AllApplicationsActivity.class.getName())) {
             mShowSystem = true;
-        } else if (className.equals(NotificationAppListActivity.class.getName())) {
+        } else if (className.equals(NotificationAppListActivity.class.getName())
+                || this instanceof NotificationApps) {
             mListType = LIST_TYPE_NOTIFICATION;
             mNotifBackend = new NotificationBackend();
         } else if (className.equals(StorageUseActivity.class.getName())) {
@@ -546,8 +548,13 @@
         if (mOptionsMenu == null) {
             return;
         }
-        mOptionsMenu.findItem(R.id.advanced).setVisible(
-                mListType == LIST_TYPE_MAIN || mListType == LIST_TYPE_NOTIFICATION);
+        final Context context = getActivity();
+        if (FeatureFactory.getFactory(context).getDashboardFeatureProvider(context).isEnabled()) {
+            mOptionsMenu.findItem(R.id.advanced).setVisible(false);
+        } else {
+            mOptionsMenu.findItem(R.id.advanced).setVisible(
+                    mListType == LIST_TYPE_MAIN || mListType == LIST_TYPE_NOTIFICATION);
+        }
 
         mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible(mListType == LIST_TYPE_STORAGE
                 && mSortOrder != R.id.sort_order_alpha);
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java
new file mode 100644
index 0000000..ce82612
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2016 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.bluetooth;
+
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.Intent;
+import android.text.Editable;
+import android.util.Log;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import com.android.settings.R;
+import com.android.settings.bluetooth.BluetoothPairingDialogFragment.BluetoothPairingDialogListener;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import java.util.Locale;
+
+/**
+ * A controller used by {@link BluetoothPairingDialog} to manage connection state while we try to
+ * pair with a bluetooth device. It includes methods that allow the
+ * {@link BluetoothPairingDialogFragment} to interrogate the current state as well.
+ */
+public class BluetoothPairingController implements OnCheckedChangeListener,
+        BluetoothPairingDialogListener {
+
+    private static final String TAG = "BTPairingController";
+
+    // Different types of dialogs we can map to
+    public static final int INVALID_DIALOG_TYPE = -1;
+    public static final int USER_ENTRY_DIALOG = 0;
+    public static final int CONFIRMATION_DIALOG = 1;
+    public static final int DISPLAY_PASSKEY_DIALOG = 2;
+
+    private static final int BLUETOOTH_PIN_MAX_LENGTH = 16;
+    private static final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6;
+
+    // Bluetooth dependencies for the connection we are trying to establish
+    private LocalBluetoothManager mBluetoothManager;
+    private BluetoothDevice mDevice;
+    private int mType;
+    private String mUserInput;
+    private String mPasskeyFormatted;
+    private int mPasskey;
+    private String mDeviceName;
+    private LocalBluetoothProfile mPbapClientProfile;
+
+    /**
+     * Creates an instance of a BluetoothPairingController.
+     *
+     * @param intent - must contain {@link BluetoothDevice#EXTRA_PAIRING_VARIANT}, {@link
+     * BluetoothDevice#EXTRA_PAIRING_KEY}, and {@link BluetoothDevice#EXTRA_DEVICE}. Missing extra
+     * will lead to undefined behavior.
+     */
+    public BluetoothPairingController(Intent intent, Context context) {
+        mBluetoothManager = Utils.getLocalBtManager(context);
+        mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+
+        String message = "";
+        if (mBluetoothManager == null) {
+            throw new IllegalStateException("Could not obtain LocalBluetoothManager");
+        } else if (mDevice == null) {
+            throw new IllegalStateException("Could not find BluetoothDevice");
+        }
+
+        mType = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
+        mPasskey = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, BluetoothDevice.ERROR);
+        mDeviceName = mBluetoothManager.getCachedDeviceManager().getName(mDevice);
+        mPbapClientProfile = mBluetoothManager.getProfileManager().getPbapClientProfile();
+        mPasskeyFormatted = formatKey(mPasskey);
+
+    }
+
+    @Override
+    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+        if (isChecked) {
+            mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
+        } else {
+            mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
+        }
+    }
+
+    @Override
+    public void onDialogPositiveClick(BluetoothPairingDialogFragment dialog) {
+        if (getDialogType() == USER_ENTRY_DIALOG) {
+            onPair(mUserInput);
+        } else {
+            onPair(null);
+        }
+    }
+
+    @Override
+    public void onDialogNegativeClick(BluetoothPairingDialogFragment dialog) {
+        onCancel();
+    }
+
+    /**
+     * A method for querying which bluetooth pairing dialog fragment variant this device requires.
+     *
+     * @return - The dialog view variant needed for this device.
+     */
+    public int getDialogType() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PIN:
+            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                return USER_ENTRY_DIALOG;
+
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
+            case BluetoothDevice.PAIRING_VARIANT_CONSENT:
+            case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
+                return CONFIRMATION_DIALOG;
+
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
+                return DISPLAY_PASSKEY_DIALOG;
+
+            default:
+                return INVALID_DIALOG_TYPE;
+        }
+    }
+
+    /**
+     * @return - A string containing the name provided by the device.
+     */
+    public String getDeviceName() {
+        return mDeviceName;
+    }
+
+    /**
+     * A method for querying if the bluetooth device has a profile already set up on this device.
+     *
+     * @return - A boolean indicating if the device has previous knowledge of a profile for this
+     * device.
+     */
+    public boolean isProfileReady() {
+        return mPbapClientProfile != null && mPbapClientProfile.isProfileReady();
+    }
+
+    /**
+     * A method for querying if the bluetooth device has access to contacts on the device.
+     *
+     * @return - A boolean indicating if the bluetooth device has permission to access the device
+     * contacts
+     */
+    public boolean getContactSharingState() {
+        switch (mDevice.getPhonebookAccessPermission()) {
+            case BluetoothDevice.ACCESS_ALLOWED:
+                return true;
+            case BluetoothDevice.ACCESS_REJECTED:
+                return false;
+            default:
+                if (mDevice.getBluetoothClass().getDeviceClass()
+                        == BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE) {
+                    return true;
+                }
+                return false;
+        }
+    }
+
+    /**
+     * A method for querying if the provided editable is a valid passkey/pin format for this device.
+     *
+     * @param s - The passkey/pin
+     * @return - A boolean indicating if the passkey/pin is of the correct format.
+     */
+    public boolean isPasskeyValid(Editable s) {
+        boolean requires16Digits = mType == BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS;
+        return s.length() >= 16 && requires16Digits || s.length() > 0 && !requires16Digits;
+    }
+
+    /**
+     * A method for querying what message should be shown to the user as additional text in the
+     * dialog for this device. Returns -1 to indicate a device type that does not use this message.
+     *
+     * @return - The message ID to show the user.
+     */
+    public int getDeviceVariantMessageId() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
+            case BluetoothDevice.PAIRING_VARIANT_PIN:
+                return R.string.bluetooth_enter_pin_other_device;
+
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                return R.string.bluetooth_enter_passkey_other_device;
+
+            default:
+                return INVALID_DIALOG_TYPE;
+        }
+    }
+
+    /**
+     * A method for querying what message hint should be shown to the user as additional text in the
+     * dialog for this device. Returns -1 to indicate a device type that does not use this message.
+     *
+     * @return - The message ID to show the user.
+     */
+    public int getDeviceVariantMessageHintId() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
+                return R.string.bluetooth_pin_values_hint_16_digits;
+
+            case BluetoothDevice.PAIRING_VARIANT_PIN:
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                return R.string.bluetooth_pin_values_hint;
+
+            default:
+                return INVALID_DIALOG_TYPE;
+        }
+    }
+
+    /**
+     * A method for querying the maximum passkey/pin length for this device.
+     *
+     * @return - An int indicating the maximum length
+     */
+    public int getDeviceMaxPasskeyLength() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
+            case BluetoothDevice.PAIRING_VARIANT_PIN:
+                return BLUETOOTH_PIN_MAX_LENGTH;
+
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                return BLUETOOTH_PASSKEY_MAX_LENGTH;
+
+            default:
+                return 0;
+        }
+
+    }
+
+    /**
+     * A method for querying if the device uses an alphanumeric passkey.
+     *
+     * @return - a boolean indicating if the passkey can be alphanumeric.
+     */
+    public boolean pairingCodeIsAlphanumeric() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                return false;
+
+            default:
+                return true;
+        }
+    }
+
+    /**
+     * A method used by the dialogfragment to notify the controller that the dialog has been
+     * displayed for bluetooth device types that just care about it being displayed.
+     */
+    protected void notifyDialogDisplayed() {
+        // send an OK to the framework, indicating that the dialog has been displayed.
+        if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
+            mDevice.setPairingConfirmation(true);
+        } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN) {
+            byte[] pinBytes = BluetoothDevice.convertPinToBytes(mPasskeyFormatted);
+            mDevice.setPin(pinBytes);
+        }
+    }
+
+    /**
+     * A method for querying if this bluetooth device type has a key it would like displayed
+     * to the user.
+     *
+     * @return - A boolean indicating if a key exists which should be displayed to the user.
+     */
+    public boolean isDisplayPairingKeyVariant() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
+            case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * A method for querying if this bluetooth device type has other content it would like displayed
+     * to the user.
+     *
+     * @return - A boolean indicating if content exists which should be displayed to the user.
+     */
+    public boolean hasPairingContent() {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
+                return true;
+
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * A method for obtaining any additional content this bluetooth device has for displaying to the
+     * user.
+     *
+     * @return - A string containing the additional content, null if none exists.
+     * @see {@link BluetoothPairingController#hasPairingContent()}
+     */
+    public String getPairingContent() {
+        if (hasPairingContent()) {
+            return mPasskeyFormatted;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * A method that exists to allow the fragment to update the controller with input the user has
+     * provided in the fragment.
+     *
+     * @param input - A string containing the user input.
+     */
+    protected void updateUserInput(String input) {
+        mUserInput = input;
+    }
+
+    /**
+     * Returns the provided passkey in a format that this device expects. Only works for numeric
+     * passkeys/pins.
+     *
+     * @param passkey - An integer containing the passkey to format.
+     * @return - A string containing the formatted passkey/pin
+     */
+    private String formatKey(int passkey) {
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
+                return String.format(Locale.US, "%06d", passkey);
+
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
+                return String.format("%04d", passkey);
+
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * handles the necessary communication with the bluetooth device to establish a successful
+     * pairing
+     *
+     * @param passkey - The passkey we will attempt to pair to the device with.
+     */
+    private void onPair(String passkey) {
+        Log.d(TAG, "Pairing dialog accepted");
+        switch (mType) {
+            case BluetoothDevice.PAIRING_VARIANT_PIN:
+            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
+                byte[] pinBytes = BluetoothDevice.convertPinToBytes(passkey);
+                if (pinBytes == null) {
+                    return;
+                }
+                mDevice.setPin(pinBytes);
+                break;
+
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                int pass = Integer.parseInt(passkey);
+                mDevice.setPasskey(pass);
+                break;
+
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
+            case BluetoothDevice.PAIRING_VARIANT_CONSENT:
+                mDevice.setPairingConfirmation(true);
+                break;
+
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
+            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
+                // Do nothing.
+                break;
+
+            case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
+                mDevice.setRemoteOutOfBandData();
+                break;
+
+            default:
+                Log.e(TAG, "Incorrect pairing type received");
+        }
+    }
+
+    /**
+     * A method for properly ending communication with the bluetooth device. Will be called by the
+     * {@link BluetoothPairingDialogFragment} when it is dismissed.
+     */
+    public void onCancel() {
+        Log.d(TAG, "Pairing dialog canceled");
+        mDevice.cancelPairingUserInput();
+    }
+
+    /**
+     * A method for checking if this device is equal to another device.
+     *
+     * @param device - The other device being compared to this device.
+     * @return - A boolean indicating if the devices were equal.
+     */
+    public boolean deviceEquals(BluetoothDevice device) {
+        return mDevice == device;
+    }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
old mode 100755
new mode 100644
index 27cd532..ed63fcb
--- a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2016 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.
@@ -16,65 +16,28 @@
 
 package com.android.settings.bluetooth;
 
-import android.bluetooth.BluetoothClass;
+import android.annotation.Nullable;
+import android.app.Activity;
 import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothUuid;
 import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
-import android.text.Editable;
-import android.text.InputFilter;
-import android.text.InputFilter.LengthFilter;
-import android.text.InputType;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.TextWatcher;
-import android.text.style.TtsSpan;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import com.android.internal.app.AlertActivity;
-import com.android.internal.app.AlertController;
-import com.android.settings.R;
-import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.bluetooth.LocalBluetoothProfile;
-
-import java.util.Locale;
 
 /**
  * BluetoothPairingDialog asks the user to enter a PIN / Passkey / simple confirmation
  * for pairing with a remote Bluetooth device. It is an activity that appears as a dialog.
  */
-public final class BluetoothPairingDialog extends AlertActivity implements
-        CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener, TextWatcher {
-    private static final String TAG = "BluetoothPairingDialog";
+public final class BluetoothPairingDialog extends Activity {
+    public static final String FRAGMENT_TAG = "bluetooth.pairing.fragment";
 
-    private static final int BLUETOOTH_PIN_MAX_LENGTH = 16;
-    private static final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6;
-
-    private LocalBluetoothManager mBluetoothManager;
-    private CachedBluetoothDeviceManager mCachedDeviceManager;
-    private BluetoothDevice mDevice;
-    private int mType;
-    private String mPairingKey;
-    private EditText mPairingView;
-    private Button mOkButton;
-    private LocalBluetoothProfile mPbapClientProfile;
+    private BluetoothPairingController mBluetoothPairingController;
     private boolean mReceiverRegistered;
 
     /**
      * Dismiss the dialog if the bond state changes to bonded or none,
-     * or if pairing was canceled for {@link #mDevice}.
+     * or if pairing was canceled for {@link BluetoothPairingController#mDevice}.
      */
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
@@ -82,14 +45,14 @@
             String action = intent.getAction();
             if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
                 int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
-                                                   BluetoothDevice.ERROR);
+                        BluetoothDevice.ERROR);
                 if (bondState == BluetoothDevice.BOND_BONDED ||
                         bondState == BluetoothDevice.BOND_NONE) {
                     dismiss();
                 }
             } else if (BluetoothDevice.ACTION_PAIRING_CANCEL.equals(action)) {
                 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-                if (device == null || device.equals(mDevice)) {
+                if (device == null || mBluetoothPairingController.deviceEquals(device)) {
                     dismiss();
                 }
             }
@@ -97,72 +60,29 @@
     };
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        boolean fragmentFound = true;
 
+        BluetoothPairingDialogFragment bluetoothFragment =
+                (BluetoothPairingDialogFragment) getFragmentManager()
+                        .findFragmentByTag(FRAGMENT_TAG);
         Intent intent = getIntent();
-        if (!intent.getAction().equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
-            Log.e(TAG, "Error: this activity may be started only with intent " +
-                  BluetoothDevice.ACTION_PAIRING_REQUEST);
-            finish();
-            return;
+        mBluetoothPairingController = new BluetoothPairingController(intent, this);
+
+        // check if the fragment exists already
+        if (bluetoothFragment == null) {
+            fragmentFound = false;
+            bluetoothFragment = new BluetoothPairingDialogFragment();
         }
 
-        mBluetoothManager = Utils.getLocalBtManager(this);
-        if (mBluetoothManager == null) {
-            Log.e(TAG, "Error: BluetoothAdapter not supported by system");
-            finish();
-            return;
+        // set the controller
+        bluetoothFragment.setPairingController(mBluetoothPairingController);
+
+        // pass the fragment to the manager when it is created from scratch
+        if (!fragmentFound) {
+            bluetoothFragment.show(getFragmentManager(), FRAGMENT_TAG);
         }
-        mCachedDeviceManager = mBluetoothManager.getCachedDeviceManager();
-        mPbapClientProfile = mBluetoothManager.getProfileManager().getPbapClientProfile();
-
-        mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-        mType = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
-
-        switch (mType) {
-            case BluetoothDevice.PAIRING_VARIANT_PIN:
-            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
-                createUserEntryDialog();
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
-                int passkey =
-                    intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, BluetoothDevice.ERROR);
-                if (passkey == BluetoothDevice.ERROR) {
-                    Log.e(TAG, "Invalid Confirmation Passkey received, not showing any dialog");
-                    return;
-                }
-                mPairingKey = String.format(Locale.US, "%06d", passkey);
-                createConfirmationDialog();
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_CONSENT:
-            case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
-                createConsentDialog();
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
-            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
-                int pairingKey =
-                    intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, BluetoothDevice.ERROR);
-                if (pairingKey == BluetoothDevice.ERROR) {
-                    Log.e(TAG, "Invalid Confirmation Passkey or PIN received, not showing any dialog");
-                    return;
-                }
-                if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
-                    mPairingKey = String.format("%06d", pairingKey);
-                } else {
-                    mPairingKey = String.format("%04d", pairingKey);
-                }
-                createDisplayPasskeyOrPinDialog();
-                break;
-
-            default:
-                Log.e(TAG, "Incorrect pairing type received, not showing any dialog");
-        }
-
         /*
          * Leave this registered through pause/resume since we still want to
          * finish the activity in the background if pairing is canceled.
@@ -172,210 +92,6 @@
         mReceiverRegistered = true;
     }
 
-    private void createUserEntryDialog() {
-        final AlertController.AlertParams p = mAlertParams;
-        p.mTitle = getString(R.string.bluetooth_pairing_request,
-                mCachedDeviceManager.getName(mDevice));
-        p.mView = createPinEntryView();
-        p.mPositiveButtonText = getString(android.R.string.ok);
-        p.mPositiveButtonListener = this;
-        p.mNegativeButtonText = getString(android.R.string.cancel);
-        p.mNegativeButtonListener = this;
-        setupAlert();
-
-        mOkButton = mAlert.getButton(BUTTON_POSITIVE);
-        mOkButton.setEnabled(false);
-    }
-
-    private View createPinEntryView() {
-        View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
-        TextView messageViewCaptionHint = (TextView) view.findViewById(R.id.pin_values_hint);
-        TextView messageView2 = (TextView) view.findViewById(R.id.message_below_pin);
-        CheckBox alphanumericPin = (CheckBox) view.findViewById(R.id.alphanumeric_pin);
-        CheckBox contactSharing = (CheckBox) view.findViewById(
-                R.id.phonebook_sharing_message_entry_pin);
-        contactSharing.setText(getString(R.string.bluetooth_pairing_shares_phonebook,
-                mCachedDeviceManager.getName(mDevice)));
-        if (mPbapClientProfile != null && mPbapClientProfile.isProfileReady()) {
-            contactSharing.setVisibility(View.GONE);
-        }
-        if (mDevice.getPhonebookAccessPermission() == BluetoothDevice.ACCESS_ALLOWED) {
-            contactSharing.setChecked(true);
-        } else if (mDevice.getPhonebookAccessPermission() == BluetoothDevice.ACCESS_REJECTED){
-            contactSharing.setChecked(false);
-        } else {
-            if (mDevice.getBluetoothClass().getDeviceClass()
-                    == BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE) {
-                contactSharing.setChecked(true);
-                mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
-            } else {
-                contactSharing.setChecked(false);
-                mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
-            }
-        }
-
-        contactSharing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
-                if (isChecked) {
-                    mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
-                } else {
-                    mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
-                }
-            }
-        });
-
-        mPairingView = (EditText) view.findViewById(R.id.text);
-        mPairingView.addTextChangedListener(this);
-        alphanumericPin.setOnCheckedChangeListener(this);
-
-        int messageId;
-        int messageIdHint = R.string.bluetooth_pin_values_hint;
-        int maxLength;
-        switch (mType) {
-            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
-                messageIdHint = R.string.bluetooth_pin_values_hint_16_digits;
-                // FALLTHROUGH
-            case BluetoothDevice.PAIRING_VARIANT_PIN:
-                messageId = R.string.bluetooth_enter_pin_other_device;
-                // Maximum of 16 characters in a PIN
-                maxLength = BLUETOOTH_PIN_MAX_LENGTH;
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
-                messageId = R.string.bluetooth_enter_passkey_other_device;
-                // Maximum of 6 digits for passkey
-                maxLength = BLUETOOTH_PASSKEY_MAX_LENGTH;
-                alphanumericPin.setVisibility(View.GONE);
-                break;
-
-            default:
-                Log.e(TAG, "Incorrect pairing type for createPinEntryView: " + mType);
-                return null;
-        }
-
-        messageViewCaptionHint.setText(messageIdHint);
-        messageView2.setText(messageId);
-        mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER);
-        mPairingView.setFilters(new InputFilter[] {
-                new LengthFilter(maxLength) });
-
-        return view;
-    }
-
-    private View createView() {
-        View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_confirm, null);
-        TextView pairingViewCaption = (TextView) view.findViewById(R.id.pairing_caption);
-        TextView pairingViewContent = (TextView) view.findViewById(R.id.pairing_subhead);
-        TextView messagePairing = (TextView) view.findViewById(R.id.pairing_code_message);
-        CheckBox contactSharing = (CheckBox) view.findViewById(
-                R.id.phonebook_sharing_message_confirm_pin);
-        contactSharing.setText(getString(R.string.bluetooth_pairing_shares_phonebook,
-                mCachedDeviceManager.getName(mDevice)));
-        if (mPbapClientProfile != null && mPbapClientProfile.isProfileReady()) {
-            contactSharing.setVisibility(View.GONE);
-        }
-        if (mDevice.getPhonebookAccessPermission() == BluetoothDevice.ACCESS_ALLOWED) {
-            contactSharing.setChecked(true);
-        } else if (mDevice.getPhonebookAccessPermission() == BluetoothDevice.ACCESS_REJECTED){
-            contactSharing.setChecked(false);
-        } else {
-            if (mDevice.getBluetoothClass().getDeviceClass()
-                    == BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE) {
-                contactSharing.setChecked(true);
-                mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
-            } else {
-                contactSharing.setChecked(false);
-                mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
-            }
-        }
-
-        contactSharing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
-                if (isChecked) {
-                    mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
-                } else {
-                    mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
-                }
-            }
-        });
-
-        SpannableString pairingContent = null;
-        switch (mType) {
-            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
-            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
-                messagePairing.setVisibility(View.VISIBLE);
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION: {
-                pairingContent = new SpannableString(mPairingKey);
-                pairingContent.setSpan(new TtsSpan.DigitsBuilder(mPairingKey).build(),
-                        0, mPairingKey.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
-                break;
-            }
-            case BluetoothDevice.PAIRING_VARIANT_CONSENT:
-                messagePairing.setVisibility(view.GONE);
-                break;
-            case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
-                messagePairing.setVisibility(View.VISIBLE);
-                break;
-
-            default:
-                Log.e(TAG, "Incorrect pairing type received, not creating view");
-                return null;
-        }
-
-        if (pairingContent != null) {
-            pairingViewCaption.setVisibility(View.VISIBLE);
-            pairingViewContent.setVisibility(View.VISIBLE);
-            pairingViewContent.setText(pairingContent);
-        }
-
-        return view;
-    }
-
-    private void createConfirmationDialog() {
-        final AlertController.AlertParams p = mAlertParams;
-        p.mTitle = getString(R.string.bluetooth_pairing_request,
-                mCachedDeviceManager.getName(mDevice));
-        p.mView = createView();
-        p.mPositiveButtonText = getString(R.string.bluetooth_pairing_accept);
-        p.mPositiveButtonListener = this;
-        p.mNegativeButtonText = getString(R.string.bluetooth_pairing_decline);
-        p.mNegativeButtonListener = this;
-        setupAlert();
-    }
-
-    private void createConsentDialog() {
-        final AlertController.AlertParams p = mAlertParams;
-        p.mTitle = getString(R.string.bluetooth_pairing_request,
-                mCachedDeviceManager.getName(mDevice));
-        p.mView = createView();
-        p.mPositiveButtonText = getString(R.string.bluetooth_pairing_accept);
-        p.mPositiveButtonListener = this;
-        p.mNegativeButtonText = getString(R.string.bluetooth_pairing_decline);
-        p.mNegativeButtonListener = this;
-        setupAlert();
-    }
-
-    private void createDisplayPasskeyOrPinDialog() {
-        final AlertController.AlertParams p = mAlertParams;
-        p.mTitle = getString(R.string.bluetooth_pairing_request,
-                mCachedDeviceManager.getName(mDevice));
-        p.mView = createView();
-        p.mNegativeButtonText = getString(android.R.string.cancel);
-        p.mNegativeButtonListener = this;
-        setupAlert();
-
-        // Since its only a notification, send an OK to the framework,
-        // indicating that the dialog has been displayed.
-        if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
-            mDevice.setPairingConfirmation(true);
-        } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN) {
-            byte[] pinBytes = BluetoothDevice.convertPinToBytes(mPairingKey);
-            mDevice.setPin(pinBytes);
-        }
-    }
-
     @Override
     protected void onDestroy() {
         super.onDestroy();
@@ -385,95 +101,9 @@
         }
     }
 
-    public void afterTextChanged(Editable s) {
-        if (mOkButton != null) {
-            if (mType == BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS) {
-                mOkButton.setEnabled(s.length() >= 16);
-            } else {
-                mOkButton.setEnabled(s.length() > 0);
-            }
-        }
-    }
-
-    private void onPair(String value) {
-        Log.i(TAG, "Pairing dialog accepted");
-        switch (mType) {
-            case BluetoothDevice.PAIRING_VARIANT_PIN:
-            case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
-                byte[] pinBytes = BluetoothDevice.convertPinToBytes(value);
-                if (pinBytes == null) {
-                    return;
-                }
-                mDevice.setPin(pinBytes);
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
-                int passkey = Integer.parseInt(value);
-                mDevice.setPasskey(passkey);
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
-            case BluetoothDevice.PAIRING_VARIANT_CONSENT:
-                mDevice.setPairingConfirmation(true);
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
-            case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
-                // Do nothing.
-                break;
-
-            case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
-                mDevice.setRemoteOutOfBandData();
-                break;
-
-            default:
-                Log.e(TAG, "Incorrect pairing type received");
-        }
-    }
-
-    private void onCancel() {
-        Log.i(TAG, "Pairing dialog canceled");
-        mDevice.cancelPairingUserInput();
-    }
-
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            onCancel();
-        }
-        return super.onKeyDown(keyCode,event);
-    }
-
-    public void onClick(DialogInterface dialog, int which) {
-        switch (which) {
-            case BUTTON_POSITIVE:
-                if (mPairingView != null) {
-                    onPair(mPairingView.getText().toString());
-                } else {
-                    onPair(null);
-                }
-                break;
-
-            case BUTTON_NEGATIVE:
-            default:
-                onCancel();
-                break;
-        }
-    }
-
-    /* Not used */
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-    }
-
-    /* Not used */
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-    }
-
-    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-        // change input type for soft keyboard to numeric or alphanumeric
-        if (isChecked) {
-            mPairingView.setInputType(InputType.TYPE_CLASS_TEXT);
-        } else {
-            mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER);
+    private void dismiss() {
+        if (!isFinishing()) {
+            finish();
         }
     }
 }
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
new file mode 100644
index 0000000..abeb862
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2016 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.bluetooth;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.InputFilter.LengthFilter;
+import android.text.InputType;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.TextView;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+/**
+ * A dialogFragment used by {@link BluetoothPairingDialog} to create an appropriately styled dialog
+ * for the bluetooth device.
+ */
+public class BluetoothPairingDialogFragment extends InstrumentedDialogFragment implements
+        TextWatcher, OnClickListener {
+
+    private static final String TAG = "BTPairingDialogFragment";
+
+    private AlertDialog.Builder mBuilder;
+    private AlertDialog mDialog;
+    private BluetoothPairingController mPairingController;
+    private EditText mPairingView;
+    /**
+     * The interface we expect a listener to implement. Typically this should be done by
+     * the controller.
+     */
+    public interface BluetoothPairingDialogListener {
+
+        void onDialogNegativeClick(BluetoothPairingDialogFragment dialog);
+
+        void onDialogPositiveClick(BluetoothPairingDialogFragment dialog);
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        if (mPairingController == null) {
+            throw new IllegalStateException(
+                    "Must call setPairingController() before showing dialog");
+        }
+        mBuilder = new AlertDialog.Builder(getActivity());
+        mDialog = setupDialog();
+        mDialog.setCanceledOnTouchOutside(false);
+        return mDialog;
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        // enable the positive button when we detect potentially valid input
+        Button positiveButton = mDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+        if (positiveButton != null) {
+            positiveButton.setEnabled(mPairingController.isPasskeyValid(s));
+        }
+        // notify the controller about user input
+        mPairingController.updateUserInput(s.toString());
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (which == DialogInterface.BUTTON_POSITIVE) {
+            mPairingController.onDialogPositiveClick(this);
+        } else if (which == DialogInterface.BUTTON_NEGATIVE) {
+            mPairingController.onDialogNegativeClick(this);
+        }
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.BLUETOOTH_DIALOG_FRAGMENT;
+    }
+
+    /**
+     * Used in testing to get a reference to the dialog.
+     * @return - The fragments current dialog
+     */
+    protected AlertDialog getmDialog() {
+        return mDialog;
+    }
+
+    /**
+     * Sets the controller that the fragment should use. this method MUST be called
+     * before you try to show the dialog or an error will be thrown. An implementation
+     * of a pairing controller can be found at {@link BluetoothPairingController}. A
+     * controller may not be substituted once it is assigned. Forcibly switching a
+     * controller for a new one will lead to undefined behavior.
+     */
+    public void setPairingController(BluetoothPairingController pairingController) {
+        if (mPairingController != null) {
+            throw new IllegalStateException("The controller can only be set once. "
+                    + "Forcibly replacing it will lead to undefined behavior");
+        }
+        mPairingController = pairingController;
+    }
+
+    /**
+     * Creates the appropriate type of dialog and returns it.
+     */
+    private AlertDialog setupDialog() {
+        AlertDialog dialog;
+        switch (mPairingController.getDialogType()) {
+            case BluetoothPairingController.USER_ENTRY_DIALOG:
+                dialog = createUserEntryDialog();
+                break;
+            case BluetoothPairingController.CONFIRMATION_DIALOG:
+                dialog = createConsentDialog();
+                break;
+            case BluetoothPairingController.DISPLAY_PASSKEY_DIALOG:
+                dialog = createDisplayPasskeyOrPinDialog();
+                break;
+            default:
+                dialog = null;
+                Log.e(TAG, "Incorrect pairing type received, not showing any dialog");
+        }
+        return dialog;
+    }
+
+    /**
+     * Returns a dialog with UI elements that allow a user to provide input.
+     */
+    private AlertDialog createUserEntryDialog() {
+        mBuilder.setTitle(getString(R.string.bluetooth_pairing_request,
+                mPairingController.getDeviceName()));
+        mBuilder.setView(createPinEntryView());
+        mBuilder.setPositiveButton(getString(android.R.string.ok), this);
+        mBuilder.setNegativeButton(getString(android.R.string.cancel), this);
+        AlertDialog dialog = mBuilder.create();
+        dialog.setOnShowListener(d -> mDialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false));
+        return dialog;
+    }
+
+    /**
+     * Creates the custom view with UI elements for user input.
+     */
+    private View createPinEntryView() {
+        View view = getActivity().getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
+        TextView messageViewCaptionHint = (TextView) view.findViewById(R.id.pin_values_hint);
+        TextView messageView2 = (TextView) view.findViewById(R.id.message_below_pin);
+        CheckBox alphanumericPin = (CheckBox) view.findViewById(R.id.alphanumeric_pin);
+        CheckBox contactSharing = (CheckBox) view.findViewById(
+                R.id.phonebook_sharing_message_entry_pin);
+        contactSharing.setText(getString(R.string.bluetooth_pairing_shares_phonebook,
+                mPairingController.getDeviceName()));
+        EditText pairingView = (EditText) view.findViewById(R.id.text);
+
+        contactSharing.setVisibility(mPairingController.isProfileReady()
+                ? View.GONE : View.VISIBLE);
+        contactSharing.setOnCheckedChangeListener(mPairingController);
+        contactSharing.setChecked(mPairingController.getContactSharingState());
+
+        mPairingView = pairingView;
+
+        pairingView.setInputType(InputType.TYPE_CLASS_NUMBER);
+        pairingView.addTextChangedListener(this);
+        alphanumericPin.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            // change input type for soft keyboard to numeric or alphanumeric
+            if (isChecked) {
+                mPairingView.setInputType(InputType.TYPE_CLASS_TEXT);
+            } else {
+                mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER);
+            }
+        });
+
+        int messageId = mPairingController.getDeviceVariantMessageId();
+        int messageIdHint = mPairingController.getDeviceVariantMessageHintId();
+        int maxLength = mPairingController.getDeviceMaxPasskeyLength();
+        alphanumericPin.setVisibility(mPairingController.pairingCodeIsAlphanumeric()
+                ? View.VISIBLE : View.GONE);
+        if (messageId != BluetoothPairingController.INVALID_DIALOG_TYPE) {
+            messageView2.setText(messageId);
+        } else {
+            messageView2.setVisibility(View.GONE);
+        }
+        if (messageIdHint != BluetoothPairingController.INVALID_DIALOG_TYPE) {
+            messageViewCaptionHint.setText(messageIdHint);
+        } else {
+            messageViewCaptionHint.setVisibility(View.GONE);
+        }
+        pairingView.setFilters(new InputFilter[]{
+                new LengthFilter(maxLength)});
+
+        return view;
+    }
+
+    /**
+     * Creates a dialog with UI elements that allow the user to confirm a pairing request.
+     */
+    private AlertDialog createConfirmationDialog() {
+        mBuilder.setTitle(getString(R.string.bluetooth_pairing_request,
+                mPairingController.getDeviceName()));
+        mBuilder.setView(createView());
+        mBuilder.setPositiveButton(getString(R.string.bluetooth_pairing_accept), this);
+        mBuilder.setNegativeButton(getString(R.string.bluetooth_pairing_decline), this);
+        AlertDialog dialog = mBuilder.create();
+        return dialog;
+    }
+
+    /**
+     * Creates a dialog with UI elements that allow the user to consent to a pairing request.
+     */
+    private AlertDialog createConsentDialog() {
+        return createConfirmationDialog();
+    }
+
+    /**
+     * Creates a dialog that informs users of a pairing request and shows them the passkey/pin
+     * of the device.
+     */
+    private AlertDialog createDisplayPasskeyOrPinDialog() {
+        mBuilder.setTitle(getString(R.string.bluetooth_pairing_request,
+                mPairingController.getDeviceName()));
+        mBuilder.setView(createView());
+        mBuilder.setNegativeButton(getString(android.R.string.cancel), this);
+        AlertDialog dialog = mBuilder.create();
+
+        // Tell the controller the dialog has been created.
+        mPairingController.notifyDialogDisplayed();
+
+        return dialog;
+    }
+
+    /**
+     * Creates a custom view for dialogs which need to show users additional information but do
+     * not require user input.
+     */
+    private View createView() {
+        View view = getActivity().getLayoutInflater().inflate(R.layout.bluetooth_pin_confirm, null);
+        TextView pairingViewCaption = (TextView) view.findViewById(R.id.pairing_caption);
+        TextView pairingViewContent = (TextView) view.findViewById(R.id.pairing_subhead);
+        TextView messagePairing = (TextView) view.findViewById(R.id.pairing_code_message);
+        CheckBox contactSharing = (CheckBox) view.findViewById(
+                R.id.phonebook_sharing_message_confirm_pin);
+        contactSharing.setText(getString(R.string.bluetooth_pairing_shares_phonebook,
+                mPairingController.getDeviceName()));
+
+        contactSharing.setVisibility(
+                mPairingController.isProfileReady() ? View.GONE : View.VISIBLE);
+        contactSharing.setChecked(mPairingController.getContactSharingState());
+        contactSharing.setOnCheckedChangeListener(mPairingController);
+
+        messagePairing.setVisibility(mPairingController.isDisplayPairingKeyVariant()
+                ? View.VISIBLE : View.GONE);
+        if (mPairingController.hasPairingContent()) {
+            pairingViewCaption.setVisibility(View.VISIBLE);
+            pairingViewContent.setVisibility(View.VISIBLE);
+            pairingViewContent.setText(mPairingController.getPairingContent());
+        }
+        return view;
+    }
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 3dfcfc7..9b222fa 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -180,13 +180,13 @@
     }
 
     @Override
-    public void onResume() {
-        // resume BluetoothEnabler before calling super.onResume() so we don't get
+    public void onStart() {
+        // resume BluetoothEnabler before calling super.onStart() so we don't get
         // any onDeviceAdded() callbacks before setting up view in updateContent()
         if (mBluetoothEnabler != null) {
             mBluetoothEnabler.resume(getActivity());
         }
-        super.onResume();
+        super.onStart();
 
         mInitiateDiscoverable = true;
 
@@ -206,8 +206,8 @@
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
+    public void onStop() {
+        super.onStop();
         if (mBluetoothEnabler != null) {
             mBluetoothEnabler.pause();
         }
diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
index e6fcbcb..c132163 100644
--- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
+++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
@@ -98,8 +98,8 @@
     abstract void addPreferencesForActivity();
 
     @Override
-    public void onResume() {
-        super.onResume();
+    public void onStart() {
+        super.onStart();
         if (mLocalManager == null || isUiRestricted()) return;
 
         mLocalManager.setForegroundActivity(getActivity());
@@ -109,8 +109,8 @@
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
+    public void onStop() {
+        super.onStop();
         if (mLocalManager == null || isUiRestricted()) {
             return;
         }
diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java
index 3fbd7bd..066f5d2 100644
--- a/src/com/android/settings/bluetooth/DevicePickerFragment.java
+++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java
@@ -47,7 +47,7 @@
     private boolean mNeedAuth;
     private String mLaunchPackage;
     private String mLaunchClass;
-    private boolean mStartScanOnResume;
+    private boolean mStartScanOnStart;
 
     @Override
     void addPreferencesForActivity() {
@@ -94,18 +94,18 @@
         super.onCreate(savedInstanceState);
         getActivity().setTitle(getString(R.string.device_picker));
         UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
-        mStartScanOnResume = !um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)
+        mStartScanOnStart = !um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)
                 && (savedInstanceState == null);  // don't start scan after rotation
         setHasOptionsMenu(true);
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
+    public void onStart() {
+        super.onStart();
         addCachedDevices();
-        if (mStartScanOnResume) {
+        if (mStartScanOnStart) {
             mLocalAdapter.startScanning(true);
-            mStartScanOnResume = false;
+            mStartScanOnStart = false;
         }
     }
 
diff --git a/src/com/android/settings/core/InstrumentedFragment.java b/src/com/android/settings/core/InstrumentedFragment.java
index 7297953..ca683e3 100644
--- a/src/com/android/settings/core/InstrumentedFragment.java
+++ b/src/com/android/settings/core/InstrumentedFragment.java
@@ -39,6 +39,7 @@
     protected final int STORAGE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 2;
     protected final int NETWORK_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 3;
     protected final int CONNECTED_DEVICE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 4;
+    protected final int APP_AND_NOTIFICATION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 5;
 
     public InstrumentedFragment() {
         // Mixin that logs visibility change for activity.
diff --git a/src/com/android/settings/core/PreferenceController.java b/src/com/android/settings/core/PreferenceController.java
index 6eac2bd..50e9b2c 100644
--- a/src/com/android/settings/core/PreferenceController.java
+++ b/src/com/android/settings/core/PreferenceController.java
@@ -50,7 +50,8 @@
     /**
      * Updates the current status of preference (summary, switch state, etc)
      */
-    public void updateState(PreferenceScreen screen) {
+    public void updateState(Preference preference) {
+
     }
 
     /**
@@ -65,6 +66,11 @@
     }
 
     /**
+     * Returns true if preference is available (should be displayed)
+     */
+    public abstract boolean isAvailable();
+
+    /**
      * Handles preference tree click
      *
      * @param preference the preference being clicked
@@ -73,6 +79,11 @@
     public abstract boolean handlePreferenceTreeClick(Preference preference);
 
     /**
+     * Returns the key for this preference.
+     */
+    public abstract String getPreferenceKey();
+
+    /**
      * Removes preference from screen.
      */
     protected final void removePreference(PreferenceScreen screen, String key) {
@@ -81,15 +92,4 @@
             screen.removePreference(pref);
         }
     }
-
-    /**
-     * Returns true if preference is available (should be displayed)
-     */
-    protected abstract boolean isAvailable();
-
-    /**
-     * Returns the key for this preference.
-     */
-    protected abstract String getPreferenceKey();
-
 }
diff --git a/src/com/android/settings/core/lifecycle/ObservablePreferenceFragment.java b/src/com/android/settings/core/lifecycle/ObservablePreferenceFragment.java
index e9822af..dbce755 100644
--- a/src/com/android/settings/core/lifecycle/ObservablePreferenceFragment.java
+++ b/src/com/android/settings/core/lifecycle/ObservablePreferenceFragment.java
@@ -42,8 +42,8 @@
     @CallSuper
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
         mLifecycle.onCreate(savedInstanceState);
+        super.onCreate(savedInstanceState);
     }
 
     @CallSuper
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index f501dfa..baea164 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -20,6 +20,7 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.os.Bundle;
+import android.support.v7.util.DiffUtil;
 import android.support.v7.widget.PopupMenu;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
@@ -34,7 +35,6 @@
 import android.widget.TextView;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
@@ -48,82 +48,91 @@
 import java.util.List;
 
 public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
-        implements View.OnClickListener, SummaryLoader.SummaryConsumer {
+        implements SummaryLoader.SummaryConsumer {
     public static final String TAG = "DashboardAdapter";
     private static final String STATE_SUGGESTION_LIST = "suggestion_list";
     private static final String STATE_CATEGORY_LIST = "category_list";
-    private static final String STATE_IS_SHOWING_ALL = "is_showing_all";
     private static final String STATE_SUGGESTION_MODE = "suggestion_mode";
-    private static final int NS_SPACER = 0;
-    private static final int NS_SUGGESTION = 1000;
-    private static final int NS_ITEMS = 2000;
-    private static final int NS_CONDITION = 3000;
 
-    private static int SUGGESTION_MODE_DEFAULT = 0;
-    private static int SUGGESTION_MODE_COLLAPSED = 1;
-    private static int SUGGESTION_MODE_EXPANDED = 2;
-
-    private static final int DEFAULT_SUGGESTION_COUNT = 2;
-
-    private final List<Object> mItems = new ArrayList<>();
-    private final List<Integer> mTypes = new ArrayList<>();
-    private final List<Integer> mIds = new ArrayList<>();
     private final IconCache mCache;
-
     private final Context mContext;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
-
-    private List<DashboardCategory> mCategories;
-    private List<Condition> mConditions;
-    private List<Tile> mSuggestions;
-
-    private boolean mIsShowingAll;
-    // Used for counting items;
-    private int mId;
-
-    private int mSuggestionMode = SUGGESTION_MODE_DEFAULT;
-
-    private Condition mExpandedCondition = null;
+    private DashboardData mDashboardData;
     private SuggestionParser mSuggestionParser;
 
+    private View.OnClickListener mTileClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            //TODO: get rid of setTag/getTag
+            ((SettingsActivity) mContext).openTile((Tile) v.getTag());
+        }
+    };
+
+    private View.OnClickListener mConditionClickListener = new View.OnClickListener() {
+
+        @Override
+        public void onClick(View v) {
+            Condition expandedCondition = mDashboardData.getExpandedCondition();
+
+            //TODO: get rid of setTag/getTag
+            if (v.getTag() == expandedCondition) {
+                mMetricsFeatureProvider.action(mContext,
+                        MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
+                        expandedCondition.getMetricsConstant());
+                expandedCondition.onPrimaryClick();
+            } else {
+                expandedCondition = (Condition) v.getTag();
+                mMetricsFeatureProvider.action(mContext,
+                        MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
+                        expandedCondition.getMetricsConstant());
+
+                updateExpandedCondition(expandedCondition);
+            }
+        }
+    };
+
     public DashboardAdapter(Context context, SuggestionParser parser,
             MetricsFeatureProvider metricsFeatureProvider, Bundle savedInstanceState,
             List<Condition> conditions) {
+        List<Tile> suggestions = null;
+        List<DashboardCategory> categories = null;
+        int suggestionMode = DashboardData.SUGGESTION_MODE_DEFAULT;
+
         mContext = context;
         mMetricsFeatureProvider = metricsFeatureProvider;
         mCache = new IconCache(context);
         mSuggestionParser = parser;
-        mConditions = conditions;
 
         setHasStableIds(true);
 
-        boolean showAll = true;
         if (savedInstanceState != null) {
-            mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
-            mCategories = savedInstanceState.getParcelableArrayList(STATE_CATEGORY_LIST);
-            showAll = savedInstanceState.getBoolean(STATE_IS_SHOWING_ALL, true);
-            mSuggestionMode = savedInstanceState.getInt(
-                    STATE_SUGGESTION_MODE, SUGGESTION_MODE_DEFAULT);
+            suggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
+            categories = savedInstanceState.getParcelableArrayList(STATE_CATEGORY_LIST);
+            suggestionMode = savedInstanceState.getInt(
+                    STATE_SUGGESTION_MODE, DashboardData.SUGGESTION_MODE_DEFAULT);
         }
-        setShowingAll(showAll);
+
+        mDashboardData = new DashboardData.Builder()
+                .setConditions(conditions)
+                .setSuggestions(suggestions)
+                .setCategories(categories)
+                .setSuggestionMode(suggestionMode)
+                .build();
     }
 
     public List<Tile> getSuggestions() {
-        return mSuggestions;
+        return mDashboardData.getSuggestions();
     }
 
     public void setCategoriesAndSuggestions(List<DashboardCategory> categories,
             List<Tile> suggestions) {
-        mSuggestions = suggestions;
-        mCategories = categories;
-
         // TODO: Better place for tinting?
         TypedValue tintColor = new TypedValue();
         mContext.getTheme().resolveAttribute(com.android.internal.R.attr.colorAccent,
                 tintColor, true);
         for (int i = 0; i < categories.size(); i++) {
             for (int j = 0; j < categories.get(i).tiles.size(); j++) {
-                Tile tile = categories.get(i).tiles.get(j);
+                final Tile tile = categories.get(i).tiles.get(j);
 
                 if (!mContext.getPackageName().equals(
                         tile.intent.getComponent().getPackageName())) {
@@ -133,85 +142,49 @@
                 }
             }
         }
-        recountItems();
+
+        final DashboardData prevData = mDashboardData;
+        mDashboardData = new DashboardData.Builder(prevData)
+                .setSuggestions(suggestions)
+                .setCategories(categories)
+                .build();
+        notifyDashboardDataChanged(prevData);
     }
 
     public void setConditions(List<Condition> conditions) {
-        mConditions = conditions;
-        recountItems();
+        final DashboardData prevData = mDashboardData;
+        mDashboardData = new DashboardData.Builder(prevData)
+                .setConditions(conditions)
+                .build();
+        notifyDashboardDataChanged(prevData);
     }
 
     @Override
     public void notifySummaryChanged(Tile tile) {
-        notifyDataSetChanged();
-    }
+        final int position = mDashboardData.getPositionByTile(tile);
+        if (position != DashboardData.POSITION_NOT_FOUND) {
+            final Tile targetTile = (Tile) mDashboardData.getItemEntityByPosition(position);
+            if (!TextUtils.equals(tile.summary, targetTile.summary)) {
 
-    public void setShowingAll(boolean showingAll) {
-        mIsShowingAll = showingAll;
-        recountItems();
-    }
-
-    private void recountItems() {
-        reset();
-        boolean hasConditions = false;
-        for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
-            boolean shouldShow = mConditions.get(i).shouldShow();
-            hasConditions |= shouldShow;
-            countItem(mConditions.get(i), R.layout.condition_card, shouldShow, NS_CONDITION);
-        }
-        boolean hasSuggestions = mSuggestions != null && mSuggestions.size() != 0;
-        countItem(null, R.layout.dashboard_spacer, hasConditions && hasSuggestions, NS_SPACER);
-        countItem(null, R.layout.suggestion_header, hasSuggestions, NS_SPACER);
-        resetCount();
-        if (mSuggestions != null) {
-            int maxSuggestions = getDisplayableSuggestionCount();
-            for (int i = 0; i < mSuggestions.size(); i++) {
-                countItem(mSuggestions.get(i), R.layout.suggestion_tile, i < maxSuggestions,
-                        NS_SUGGESTION);
+                // Since usually tile in parameter and tile in mCategories are same instance,
+                // which is hard to be detected by DiffUtil, so we notifyItemChanged directly.
+                notifyItemChanged(position);
             }
         }
-        resetCount();
-        for (int i = 0; mCategories != null && i < mCategories.size(); i++) {
-            DashboardCategory category = mCategories.get(i);
-            countItem(category, R.layout.dashboard_category, mIsShowingAll
-                    && !TextUtils.isEmpty(category.title), NS_ITEMS);
-            for (int j = 0; j < category.tiles.size(); j++) {
-                Tile tile = category.tiles.get(j);
-                countItem(tile, R.layout.dashboard_tile, mIsShowingAll
-                        || ArrayUtils.contains(DashboardSummary.INITIAL_ITEMS,
-                        tile.intent.getComponent().getClassName()), NS_ITEMS);
-            }
+    }
+
+    // TODO: move this method to SuggestionParser or some other util class
+    public void disableSuggestion(Tile suggestion) {
+        if (mSuggestionParser == null) {
+            return;
         }
-        notifyDataSetChanged();
-    }
-
-    private void resetCount() {
-        mId = 0;
-    }
-
-    private void reset() {
-        mItems.clear();
-        mTypes.clear();
-        mIds.clear();
-        mId = 0;
-    }
-
-    private void countItem(Object object, int type, boolean add, int nameSpace) {
-        if (add) {
-            mItems.add(object);
-            mTypes.add(type);
-            // TODO: Counting namespaces for handling of suggestions/conds appearing/disappearing.
-            mIds.add(mId + nameSpace);
+        if (mSuggestionParser.dismissSuggestion(suggestion)) {
+            mContext.getPackageManager().setComponentEnabledSetting(
+                    suggestion.intent.getComponent(),
+                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                    PackageManager.DONT_KILL_APP);
+            mSuggestionParser.markCategoryDone(suggestion.category);
         }
-        mId++;
-    }
-
-    private int getDisplayableSuggestionCount() {
-        final int suggestionSize = mSuggestions.size();
-        return mSuggestionMode == SUGGESTION_MODE_DEFAULT
-                ? Math.min(DEFAULT_SUGGESTION_COUNT, suggestionSize)
-                : mSuggestionMode == SUGGESTION_MODE_EXPANDED
-                        ? suggestionSize : 0;
     }
 
     @Override
@@ -222,21 +195,24 @@
 
     @Override
     public void onBindViewHolder(DashboardItemHolder holder, int position) {
-        switch (mTypes.get(position)) {
+        final int type = mDashboardData.getItemTypeByPosition(position);
+        switch (type) {
             case R.layout.dashboard_category:
-                onBindCategory(holder, (DashboardCategory) mItems.get(position));
+                onBindCategory(holder,
+                        (DashboardCategory) mDashboardData.getItemEntityByPosition(position));
                 break;
             case R.layout.dashboard_tile:
-                final Tile tile = (Tile) mItems.get(position);
+                final Tile tile = (Tile) mDashboardData.getItemEntityByPosition(position);
                 onBindTile(holder, tile);
                 holder.itemView.setTag(tile);
-                holder.itemView.setOnClickListener(this);
+                holder.itemView.setOnClickListener(mTileClickListener);
                 break;
             case R.layout.suggestion_header:
-                onBindSuggestionHeader(holder);
+                onBindSuggestionHeader(holder, (DashboardData.SuggestionHeaderData)
+                        mDashboardData.getItemEntityByPosition(position));
                 break;
             case R.layout.suggestion_tile:
-                final Tile suggestion = (Tile) mItems.get(position);
+                final Tile suggestion = (Tile) mDashboardData.getItemEntityByPosition(position);
                 onBindTile(holder, suggestion);
                 holder.itemView.setOnClickListener(new View.OnClickListener() {
                     @Override
@@ -255,12 +231,12 @@
                             }
                         });
                 break;
-            case R.layout.see_all:
-                onBindSeeAll(holder);
-                break;
             case R.layout.condition_card:
-                ConditionAdapterUtils.bindViews((Condition) mItems.get(position), holder,
-                        mItems.get(position) == mExpandedCondition, this,
+                final boolean isExpanded = mDashboardData.getItemEntityByPosition(position)
+                        == mDashboardData.getExpandedCondition();
+                ConditionAdapterUtils.bindViews(
+                        (Condition) mDashboardData.getItemEntityByPosition(position),
+                        holder, isExpanded, mConditionClickListener,
                         new View.OnClickListener() {
                             @Override
                             public void onClick(View v) {
@@ -271,45 +247,103 @@
         }
     }
 
+    @Override
+    public long getItemId(int position) {
+        return mDashboardData.getItemIdByPosition(position);
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        return mDashboardData.getItemTypeByPosition(position);
+    }
+
+    @Override
+    public int getItemCount() {
+        return mDashboardData.size();
+    }
+
+    public void onExpandClick(View v) {
+        Condition expandedCondition = mDashboardData.getExpandedCondition();
+        if (v.getTag() == expandedCondition) {
+            mMetricsFeatureProvider.action(mContext,
+                    MetricsEvent.ACTION_SETTINGS_CONDITION_COLLAPSE,
+                    expandedCondition.getMetricsConstant());
+            expandedCondition = null;
+        } else {
+            expandedCondition = (Condition) v.getTag();
+            mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
+                    expandedCondition.getMetricsConstant());
+        }
+
+        updateExpandedCondition(expandedCondition);
+    }
+
+    public Object getItem(long itemId) {
+        return mDashboardData.getItemEntityById(itemId);
+    }
+
+    public static String getSuggestionIdentifier(Context context, Tile suggestion) {
+        String packageName = suggestion.intent.getComponent().getPackageName();
+        if (packageName.equals(context.getPackageName())) {
+            // Since Settings provides several suggestions, fill in the class instead of the
+            // package for these.
+            packageName = suggestion.intent.getComponent().getClassName();
+        }
+        return packageName;
+    }
+
+    private void notifyDashboardDataChanged(DashboardData prevData) {
+        if (prevData != null) {
+            final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData
+                    .ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList()));
+            diffResult.dispatchUpdatesTo(this);
+        } else {
+            notifyDataSetChanged();
+        }
+    }
+
+    private void updateExpandedCondition(Condition condition) {
+        final DashboardData prevData = mDashboardData;
+        mDashboardData = new DashboardData.Builder(prevData)
+                .setExpandedCondition(condition)
+                .build();
+        notifyDashboardDataChanged(prevData);
+    }
+
     private void showRemoveOption(View v, final Tile suggestion) {
-        PopupMenu popup = new PopupMenu(
+        final PopupMenu popup = new PopupMenu(
                 new ContextThemeWrapper(mContext, R.style.Theme_AppCompat_DayNight), v);
         popup.getMenu().add(R.string.suggestion_remove).setOnMenuItemClickListener(
                 new MenuItem.OnMenuItemClickListener() {
-            @Override
-            public boolean onMenuItemClick(MenuItem item) {
-                mMetricsFeatureProvider.action(
-                        mContext, MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
-                        DashboardAdapter.getSuggestionIdentifier(mContext, suggestion));
-                disableSuggestion(suggestion);
-                mSuggestions.remove(suggestion);
-                recountItems();
-                return true;
-            }
-        });
+                    @Override
+                    public boolean onMenuItemClick(MenuItem item) {
+                        mMetricsFeatureProvider.action(
+                                mContext, MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
+                                DashboardAdapter.getSuggestionIdentifier(mContext, suggestion));
+                        disableSuggestion(suggestion);
+                        List<Tile> suggestions = mDashboardData.getSuggestions();
+                        suggestions.remove(suggestion);
+
+                        DashboardData prevData = mDashboardData;
+                        mDashboardData = new DashboardData.Builder(prevData)
+                                .setSuggestions(suggestions)
+                                .build();
+                        notifyDashboardDataChanged(prevData);
+
+                        return true;
+                    }
+                });
         popup.show();
     }
 
-    public void disableSuggestion(Tile suggestion) {
-        if (mSuggestionParser == null) {
-            return;
-        }
-        if (mSuggestionParser.dismissSuggestion(suggestion)) {
-            mContext.getPackageManager().setComponentEnabledSetting(
-                    suggestion.intent.getComponent(),
-                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                    PackageManager.DONT_KILL_APP);
-            mSuggestionParser.markCategoryDone(suggestion.category);
-        }
-    }
+    private void onBindSuggestionHeader(final DashboardItemHolder holder, DashboardData
+            .SuggestionHeaderData data) {
+        final boolean moreSuggestions = data.hasMoreSuggestions;
+        final int undisplayedSuggestionCount = data.undisplayedSuggestionCount;
 
-    private void onBindSuggestionHeader(final DashboardItemHolder holder) {
-        final boolean moreSuggestions = hasMoreSuggestions();
-        final int undisplayedSuggestionCount =
-                mSuggestions.size() - getDisplayableSuggestionCount();
         holder.icon.setImageResource(moreSuggestions ? R.drawable.ic_expand_more
                 : R.drawable.ic_expand_less);
-        holder.title.setText(mContext.getString(R.string.suggestions_title, mSuggestions.size()));
+        holder.title.setText(mContext.getString(R.string.suggestions_title, data.suggestionSize));
         String summaryContentDescription;
         if (moreSuggestions) {
             summaryContentDescription = mContext.getResources().getQuantityString(
@@ -329,22 +363,22 @@
         holder.itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                if (hasMoreSuggestions()) {
-                    mSuggestionMode = SUGGESTION_MODE_EXPANDED;
+                final int suggestionMode;
+                if (moreSuggestions) {
+                    suggestionMode = DashboardData.SUGGESTION_MODE_EXPANDED;
                 } else {
-                    mSuggestionMode = SUGGESTION_MODE_COLLAPSED;
+                    suggestionMode = DashboardData.SUGGESTION_MODE_COLLAPSED;
                 }
-                recountItems();
+
+                DashboardData prevData = mDashboardData;
+                mDashboardData = new DashboardData.Builder(prevData)
+                        .setSuggestionMode(suggestionMode)
+                        .build();
+                notifyDashboardDataChanged(prevData);
             }
         });
     }
 
-    private boolean hasMoreSuggestions() {
-        return mSuggestionMode == SUGGESTION_MODE_COLLAPSED
-                || (mSuggestionMode == SUGGESTION_MODE_DEFAULT
-                && mSuggestions.size() > DEFAULT_SUGGESTION_COUNT);
-    }
-
     private void onBindTile(DashboardItemHolder holder, Tile tile) {
         holder.icon.setImageDrawable(mCache.getIcon(tile.icon));
         holder.title.setText(tile.title);
@@ -360,98 +394,21 @@
         holder.title.setText(category.title);
     }
 
-    private void onBindSeeAll(DashboardItemHolder holder) {
-        holder.title.setText(mIsShowingAll ? R.string.see_less
-                : R.string.see_all);
-        holder.itemView.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setShowingAll(!mIsShowingAll);
-            }
-        });
-    }
-
-    @Override
-    public long getItemId(int position) {
-        return mIds.get(position);
-    }
-
-    @Override
-    public int getItemViewType(int position) {
-        return mTypes.get(position);
-    }
-
-    @Override
-    public int getItemCount() {
-        return mIds.size();
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (v.getId() == R.id.dashboard_tile) {
-            ((SettingsActivity) mContext).openTile((Tile) v.getTag());
-            return;
-        }
-        if (v.getTag() == mExpandedCondition) {
-            mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
-                    mExpandedCondition.getMetricsConstant());
-            mExpandedCondition.onPrimaryClick();
-        } else {
-            mExpandedCondition = (Condition) v.getTag();
-            mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
-                    mExpandedCondition.getMetricsConstant());
-            notifyDataSetChanged();
-        }
-    }
-
-    public void onExpandClick(View v) {
-        if (v.getTag() == mExpandedCondition) {
-            mMetricsFeatureProvider.action(mContext,
-                    MetricsEvent.ACTION_SETTINGS_CONDITION_COLLAPSE,
-                    mExpandedCondition.getMetricsConstant());
-            mExpandedCondition = null;
-        } else {
-            mExpandedCondition = (Condition) v.getTag();
-            mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
-                    mExpandedCondition.getMetricsConstant());
-        }
-        notifyDataSetChanged();
-    }
-
-    public Object getItem(long itemId) {
-        for (int i = 0; i < mIds.size(); i++) {
-            if (mIds.get(i) == itemId) {
-                return mItems.get(i);
-            }
-        }
-        return null;
-    }
-
-    public static String getSuggestionIdentifier(Context context, Tile suggestion) {
-        String packageName = suggestion.intent.getComponent().getPackageName();
-        if (packageName.equals(context.getPackageName())) {
-            // Since Settings provides several suggestions, fill in the class instead of the
-            // package for these.
-            packageName = suggestion.intent.getComponent().getClassName();
-        }
-        return packageName;
-    }
-
     void onSaveInstanceState(Bundle outState) {
-        if (mSuggestions != null) {
+        final List<Tile> suggestions = mDashboardData.getSuggestions();
+        final List<DashboardCategory> categories = mDashboardData.getCategories();
+        if (suggestions != null) {
             outState.putParcelableArrayList(STATE_SUGGESTION_LIST,
-                    new ArrayList<Tile>(mSuggestions));
+                    new ArrayList<Tile>(suggestions));
         }
-        if (mCategories != null) {
+        if (categories != null) {
             outState.putParcelableArrayList(STATE_CATEGORY_LIST,
-                    new ArrayList<DashboardCategory>(mCategories));
+                    new ArrayList<DashboardCategory>(categories));
         }
-        outState.putBoolean(STATE_IS_SHOWING_ALL, mIsShowingAll);
-        outState.putInt(STATE_SUGGESTION_MODE, mSuggestionMode);
+        outState.putInt(STATE_SUGGESTION_MODE, mDashboardData.getSuggestionMode());
     }
 
     private static class IconCache {
-
         private final Context mContext;
         private final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
 
diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java
new file mode 100644
index 0000000..0fc994b
--- /dev/null
+++ b/src/com/android/settings/dashboard/DashboardData.java
@@ -0,0 +1,488 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.annotation.IntDef;
+import android.support.v7.util.DiffUtil;
+import android.text.TextUtils;
+import com.android.settings.dashboard.conditional.Condition;
+import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.Tile;
+import com.android.settings.R;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description about data list used in the DashboardAdapter. In the data list each item can be
+ * Condition, suggestion or category tile.
+ * <p>
+ * ItemsData has inner class Item, which represents the Item in data list.
+ */
+public class DashboardData {
+    public static final int SUGGESTION_MODE_DEFAULT = 0;
+    public static final int SUGGESTION_MODE_COLLAPSED = 1;
+    public static final int SUGGESTION_MODE_EXPANDED = 2;
+    public static final int POSITION_NOT_FOUND = -1;
+    public static final int DEFAULT_SUGGESTION_COUNT = 2;
+
+    // id namespace for different type of items.
+    private static final int NS_SPACER = 0;
+    private static final int NS_SUGGESTION = 1000;
+    private static final int NS_ITEMS = 2000;
+    private static final int NS_CONDITION = 3000;
+
+    private final List<Item> mItems;
+    private final List<DashboardCategory> mCategories;
+    private final List<Condition> mConditions;
+    private final List<Tile> mSuggestions;
+    private final int mSuggestionMode;
+    private final Condition mExpandedCondition;
+    private int mId;
+
+    private DashboardData(Builder builder) {
+        mCategories = builder.mCategories;
+        mConditions = builder.mConditions;
+        mSuggestions = builder.mSuggestions;
+        mSuggestionMode = builder.mSuggestionMode;
+        mExpandedCondition = builder.mExpandedCondition;
+
+        mItems = new ArrayList<>();
+        mId = 0;
+
+        buildItemsData();
+    }
+
+    public int getItemIdByPosition(int position) {
+        return mItems.get(position).id;
+    }
+
+    public int getItemTypeByPosition(int position) {
+        return mItems.get(position).type;
+    }
+
+    public Object getItemEntityByPosition(int position) {
+        return mItems.get(position).entity;
+    }
+
+    public List<Item> getItemList() {
+        return mItems;
+    }
+
+    public int size() {
+        return mItems.size();
+    }
+
+    public Object getItemEntityById(long id) {
+        for (final Item item : mItems) {
+            if (item.id == id) {
+                return item.entity;
+            }
+        }
+        return null;
+    }
+
+    public List<DashboardCategory> getCategories() {
+        return mCategories;
+    }
+
+    public List<Condition> getConditions() {
+        return mConditions;
+    }
+
+    public List<Tile> getSuggestions() {
+        return mSuggestions;
+    }
+
+    public int getSuggestionMode() {
+        return mSuggestionMode;
+    }
+
+    public Condition getExpandedCondition() {
+        return mExpandedCondition;
+    }
+
+    /**
+     * Find the position of the object in mItems list, using the equals method to compare
+     *
+     * @param entity the object that need to be found in list
+     * @return position of the object, return POSITION_NOT_FOUND if object isn't in the list
+     */
+    public int getPositionByEntity(Object entity) {
+        if (entity == null) return POSITION_NOT_FOUND;
+
+        final int size = mItems.size();
+        for (int i = 0; i < size; i++) {
+            final Object item = mItems.get(i).entity;
+            if (entity.equals(item)) {
+                return i;
+            }
+        }
+
+        return POSITION_NOT_FOUND;
+    }
+
+    /**
+     * Find the position of the Tile object.
+     * <p>
+     * First, try to find the exact identical instance of the tile object, if not found,
+     * then try to find a tile has the same title.
+     *
+     * @param tile tile that need to be found
+     * @return position of the object, return INDEX_NOT_FOUND if object isn't in the list
+     */
+    public int getPositionByTile(Tile tile) {
+        final int size = mItems.size();
+        for (int i = 0; i < size; i++) {
+            final Object entity = mItems.get(i).entity;
+            if (entity == tile) {
+                return i;
+            } else if (entity instanceof Tile && tile.title.equals(((Tile) entity).title)) {
+                return i;
+            }
+        }
+
+        return POSITION_NOT_FOUND;
+    }
+
+    /**
+     * Get the count of suggestions to display
+     *
+     * The displayable count mainly depends on the {@link #mSuggestionMode}
+     * and the size of suggestions list.
+     *
+     * When in default mode, displayable count couldn't larger than
+     * {@link #DEFAULT_SUGGESTION_COUNT}.
+     *
+     * When in expanded mode, display all the suggestions.
+     * @return the count of suggestions to display
+     */
+    public int getDisplayableSuggestionCount() {
+        final int suggestionSize = mSuggestions.size();
+        return mSuggestionMode == SUGGESTION_MODE_DEFAULT
+                ? Math.min(DEFAULT_SUGGESTION_COUNT, suggestionSize)
+                : mSuggestionMode == SUGGESTION_MODE_EXPANDED
+                ? suggestionSize : 0;
+    }
+
+    public boolean hasMoreSuggestions() {
+        return mSuggestionMode == SUGGESTION_MODE_COLLAPSED
+                || (mSuggestionMode == SUGGESTION_MODE_DEFAULT
+                && mSuggestions.size() > DEFAULT_SUGGESTION_COUNT);
+    }
+
+    private void resetCount() {
+        mId = 0;
+    }
+
+    /**
+     * Count the item and add it into list when {@paramref add} is true.
+     *
+     * Note that {@link #mId} will increment automatically and the real
+     * id stored in {@link Item} is shifted by {@paramref nameSpace}. This is a
+     * simple way to keep the id stable.
+     *
+     * @param object maybe {@link Condition}, {@link Tile}, {@link DashboardCategory} or null
+     * @param type type of the item, and value is the layout id
+     * @param add  flag about whether to add item into list
+     * @param nameSpace namespace based on the type
+     */
+    private void countItem(Object object, int type, boolean add, int nameSpace) {
+        if (add) {
+            mItems.add(new Item(object, type, mId + nameSpace, object == mExpandedCondition));
+        }
+        mId++;
+    }
+
+    /**
+     * Build the mItems list using mConditions, mSuggestions, mCategories data
+     * and mIsShowingAll, mSuggestionMode flag.
+     */
+    private void buildItemsData() {
+        boolean hasConditions = false;
+        for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
+            boolean shouldShow = mConditions.get(i).shouldShow();
+            hasConditions |= shouldShow;
+            countItem(mConditions.get(i), R.layout.condition_card, shouldShow, NS_CONDITION);
+        }
+
+        resetCount();
+        final boolean hasSuggestions = mSuggestions != null && mSuggestions.size() != 0;
+        countItem(null, R.layout.dashboard_spacer, hasConditions && hasSuggestions, NS_SPACER);
+        countItem(buildSuggestionHeaderData(), R.layout.suggestion_header, hasSuggestions,
+                NS_SPACER);
+
+        resetCount();
+        if (mSuggestions != null) {
+            int maxSuggestions = getDisplayableSuggestionCount();
+            for (int i = 0; i < mSuggestions.size(); i++) {
+                countItem(mSuggestions.get(i), R.layout.suggestion_tile, i < maxSuggestions,
+                        NS_SUGGESTION);
+            }
+        }
+        resetCount();
+        for (int i = 0; mCategories != null && i < mCategories.size(); i++) {
+            DashboardCategory category = mCategories.get(i);
+            countItem(category, R.layout.dashboard_category,
+                    !TextUtils.isEmpty(category.title), NS_ITEMS);
+            for (int j = 0; j < category.tiles.size(); j++) {
+                Tile tile = category.tiles.get(j);
+                countItem(tile, R.layout.dashboard_tile, true, NS_ITEMS);
+            }
+        }
+    }
+
+    private SuggestionHeaderData buildSuggestionHeaderData() {
+        SuggestionHeaderData data;
+        if (mSuggestions == null) {
+            data = new SuggestionHeaderData();
+        } else {
+            final boolean hasMoreSuggestions = hasMoreSuggestions();
+            final int suggestionSize = mSuggestions.size();
+            final int undisplayedSuggestionCount = suggestionSize - getDisplayableSuggestionCount();
+            data = new SuggestionHeaderData(hasMoreSuggestions, suggestionSize,
+                    undisplayedSuggestionCount);
+        }
+
+        return data;
+    }
+
+    /**
+     * Builder used to build the ItemsData
+     * <p>
+     * {@link #mExpandedCondition} and {@link #mSuggestionMode} have default value
+     * while others are not.
+     */
+    public static class Builder {
+        private int mSuggestionMode = SUGGESTION_MODE_DEFAULT;
+        private Condition mExpandedCondition = null;
+
+        private List<DashboardCategory> mCategories;
+        private List<Condition> mConditions;
+        private List<Tile> mSuggestions;
+
+
+        public Builder() {
+        }
+
+        public Builder(DashboardData dashboardData) {
+            mCategories = dashboardData.mCategories;
+            mConditions = dashboardData.mConditions;
+            mSuggestions = dashboardData.mSuggestions;
+            mSuggestionMode = dashboardData.mSuggestionMode;
+            mExpandedCondition = dashboardData.mExpandedCondition;
+        }
+
+        public Builder setCategories(List<DashboardCategory> categories) {
+            this.mCategories = categories;
+            return this;
+        }
+
+        public Builder setConditions(List<Condition> conditions) {
+            this.mConditions = conditions;
+            return this;
+        }
+
+        public Builder setSuggestions(List<Tile> suggestions) {
+            this.mSuggestions = suggestions;
+            return this;
+        }
+
+        public Builder setSuggestionMode(int suggestionMode) {
+            this.mSuggestionMode = suggestionMode;
+            return this;
+        }
+
+        public Builder setExpandedCondition(Condition expandedCondition) {
+            this.mExpandedCondition = expandedCondition;
+            return this;
+        }
+
+        public DashboardData build() {
+            return new DashboardData(this);
+        }
+    }
+
+    /**
+     * A DiffCallback to calculate the difference between old and new Item
+     * List in DashboardData
+     */
+    public static class ItemsDataDiffCallback extends DiffUtil.Callback {
+        final private List<Item> mOldItems;
+        final private List<Item> mNewItems;
+
+        public ItemsDataDiffCallback(List<Item> oldItems, List<Item> newItems) {
+            mOldItems = oldItems;
+            mNewItems = newItems;
+        }
+
+        @Override
+        public int getOldListSize() {
+            return mOldItems.size();
+        }
+
+        @Override
+        public int getNewListSize() {
+            return mNewItems.size();
+        }
+
+        @Override
+        public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
+            return mOldItems.get(oldItemPosition).id == mNewItems.get(newItemPosition).id;
+        }
+
+        @Override
+        public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
+            return mOldItems.get(oldItemPosition).equals(mNewItems.get(newItemPosition));
+        }
+    }
+
+    /**
+     * An item contains the data needed in the DashboardData.
+     */
+    private static class Item {
+        // valid types in field type
+        private static final int TYPE_DASHBOARD_CATEGORY = R.layout.dashboard_category;
+        private static final int TYPE_DASHBOARD_TILE = R.layout.dashboard_tile;
+        private static final int TYPE_SUGGESTION_HEADER = R.layout.suggestion_header;
+        private static final int TYPE_SUGGESTION_TILE = R.layout.suggestion_tile;
+        private static final int TYPE_CONDITION_CARD = R.layout.condition_card;
+        private static final int TYPE_DASHBOARD_SPACER = R.layout.dashboard_spacer;
+
+        @IntDef({TYPE_DASHBOARD_CATEGORY, TYPE_DASHBOARD_TILE, TYPE_SUGGESTION_HEADER,
+                TYPE_SUGGESTION_TILE, TYPE_CONDITION_CARD, TYPE_DASHBOARD_SPACER})
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface ItemTypes{}
+
+        /**
+         * The main data object in item, usually is a {@link Tile}, {@link Condition} or
+         * {@link DashboardCategory} object. This object can also be null when the
+         * item is an divider line. Please refer to {@link #buildItemsData()} for
+         * detail usage of the Item.
+         */
+        public final Object entity;
+
+        /**
+         * The type of item, value inside is the layout id(e.g. R.layout.dashboard_tile)
+         */
+        public final @ItemTypes int type;
+
+        /**
+         * Id of this item, used in the {@link ItemsDataDiffCallback} to identify the same item.
+         */
+        public final int id;
+
+        /**
+         * To store whether the condition is expanded, useless when {@link #type} is not
+         * {@link #TYPE_CONDITION_CARD}
+         */
+        public final boolean conditionExpanded;
+
+        public Item(Object entity, @ItemTypes int type, int id, boolean conditionExpanded) {
+            this.entity = entity;
+            this.type = type;
+            this.id = id;
+            this.conditionExpanded = conditionExpanded;
+        }
+
+        /**
+         * Override it to make comparision in the {@link ItemsDataDiffCallback}
+         * @param obj object to compared with
+         * @return true if the same object or has equal value.
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+
+            if (!(obj instanceof Item)) {
+                return false;
+            }
+
+            final Item targetItem = (Item) obj;
+            if (type != targetItem.type || id != targetItem.id) {
+                return false;
+            }
+
+            switch (type) {
+                case TYPE_DASHBOARD_CATEGORY:
+                    // Only check title for dashboard category
+                    return TextUtils.equals(((DashboardCategory)entity).title,
+                            ((DashboardCategory) targetItem.entity).title);
+                case TYPE_DASHBOARD_TILE:
+                    final Tile localTile = (Tile)entity;
+                    final Tile targetTile = (Tile)targetItem.entity;
+
+                    // Only check title and summary for dashboard tile
+                    return TextUtils.equals(localTile.title, targetTile.title)
+                            && TextUtils.equals(localTile.summary, targetTile.summary);
+                case TYPE_CONDITION_CARD:
+                    // First check conditionExpanded for quick return
+                    if (conditionExpanded != targetItem.conditionExpanded) {
+                        return false;
+                    }
+                    // After that, go to default to do final check
+                default:
+                    return entity == null ? targetItem.entity == null
+                            : entity.equals(targetItem.entity);
+            }
+        }
+    }
+
+    /**
+     * This class contains the data needed to build the header. The data can also be
+     * used to check the diff in DiffUtil.Callback
+     */
+    public static class SuggestionHeaderData {
+        public final boolean hasMoreSuggestions;
+        public final int suggestionSize;
+        public final int undisplayedSuggestionCount;
+
+        public SuggestionHeaderData(boolean moreSuggestions, int suggestionSize, int
+                undisplayedSuggestionCount) {
+            this.hasMoreSuggestions = moreSuggestions;
+            this.suggestionSize = suggestionSize;
+            this.undisplayedSuggestionCount = undisplayedSuggestionCount;
+        }
+
+        public SuggestionHeaderData() {
+            hasMoreSuggestions = false;
+            suggestionSize = 0;
+            undisplayedSuggestionCount = 0;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+
+            if (!(obj instanceof SuggestionHeaderData)) {
+                return false;
+            }
+
+            SuggestionHeaderData targetData = (SuggestionHeaderData) obj;
+
+            return hasMoreSuggestions == targetData.hasMoreSuggestions
+                    && suggestionSize == targetData.suggestionSize
+                    && undisplayedSuggestionCount == targetData.undisplayedSuggestionCount;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
index 92154be..8601f1d 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
@@ -15,6 +15,8 @@
  */
 package com.android.settings.dashboard;
 
+import android.app.Activity;
+import android.content.Context;
 import android.support.v7.preference.Preference;
 
 import com.android.settingslib.drawer.DashboardCategory;
@@ -53,4 +55,20 @@
      * Returns an unique string key for the tile.
      */
     String getDashboardKeyForTile(Tile tile);
+
+    /**
+     * Binds preference to data provided by tile.
+     *
+     * @param activity If tile contains intent to launch, it will be launched from this activity
+     * @param pref The preference to bind data
+     * @param tile The binding data
+     * @param key They key for preference. If null, we will generate one from tile data
+     */
+    void bindPreferenceToTile(Activity activity, Preference pref, Tile tile, String key);
+
+    /**
+     * Returns a {@link ProgressiveDisclosureMixin} for specified fragment.
+     */
+    ProgressiveDisclosureMixin getProgressiveDisclosureMixin(Context context,
+            DashboardFragment fragment);
 }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index df3f6ef..4480281 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -16,10 +16,15 @@
 
 package com.android.settings.dashboard;
 
+import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
 import android.support.v7.preference.Preference;
+import android.text.TextUtils;
 
+import com.android.settings.SettingsActivity;
 import com.android.settingslib.drawer.CategoryManager;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
@@ -72,4 +77,44 @@
         sb.append(component.getClassName());
         return sb.toString();
     }
+
+    @Override
+    public void bindPreferenceToTile(Activity activity, Preference pref, Tile tile, String key) {
+        pref.setTitle(tile.title);
+        if (!TextUtils.isEmpty(key)) {
+            pref.setKey(key);
+        } else {
+            pref.setKey(getDashboardKeyForTile(tile));
+        }
+        pref.setSummary(tile.summary);
+        if (tile.icon != null) {
+            pref.setIcon(tile.icon.loadDrawable(activity));
+        }
+        final Bundle metadata = tile.metaData;
+        String clsName = null;
+        if (metadata != null) {
+            clsName = metadata.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
+        }
+        if (!TextUtils.isEmpty(clsName)) {
+            pref.setFragment(clsName);
+        } else if (tile.intent != null) {
+            final Intent intent = new Intent(tile.intent);
+            pref.setOnPreferenceClickListener(preference -> {
+                activity.startActivityForResult(intent, 0);
+                return true;
+            });
+        }
+        // Use negated priority for order, because tile priority is based on intent-filter
+        // (larger value has higher priority). However pref order defines smaller value has
+        // higher priority.
+        if (tile.priority != 0) {
+            pref.setOrder(-tile.priority);
+        }
+    }
+
+    @Override
+    public ProgressiveDisclosureMixin getProgressiveDisclosureMixin(Context context,
+            DashboardFragment fragment) {
+        return new ProgressiveDisclosureMixin(context, this, fragment);
+    }
 }
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index b895974..3bbec09 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -17,12 +17,13 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceManager;
 import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -32,7 +33,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.overlay.FeatureFactory;
@@ -41,6 +41,7 @@
 import com.android.settingslib.drawer.SettingsDrawerActivity;
 import com.android.settingslib.drawer.Tile;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -52,12 +53,14 @@
 public abstract class DashboardFragment extends SettingsPreferenceFragment
         implements SettingsDrawerActivity.CategoryListener, Indexable,
         SummaryLoader.SummaryConsumer {
+    private static final String TAG = "DashboardFragment";
 
     private final Map<Class, PreferenceController> mPreferenceControllers =
             new ArrayMap<>();
     private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
     private DashboardDividerDecoration mDividerDecoration;
 
+    protected ProgressiveDisclosureMixin mProgressiveDisclosureMixin;
     protected DashboardFeatureProvider mDashboardFeatureProvider;
     private boolean mListeningToCategoryChange;
     private SummaryLoader mSummaryLoader;
@@ -67,6 +70,9 @@
         super.onAttach(context);
         mDashboardFeatureProvider =
                 FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);
+        mProgressiveDisclosureMixin = mDashboardFeatureProvider
+                .getProgressiveDisclosureMixin(context, this);
+        getLifecycle().addObserver(mProgressiveDisclosureMixin);
 
         final List<PreferenceController> controllers = getPreferenceControllers(context);
         if (controllers == null) {
@@ -78,6 +84,24 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        // Set ComparisonCallback so we get better animation when list changes.
+        getPreferenceManager().setPreferenceComparisonCallback(
+                new PreferenceManager.SimplePreferenceComparisonCallback());
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        final View view = super.onCreateView(inflater, container, savedInstanceState);
+        if (mDashboardFeatureProvider.isEnabled()) {
+            getListView().addItemDecoration(mDividerDecoration);
+        }
+        return view;
+    }
+
+    @Override
     public void onCategoriesChanged() {
         final DashboardCategory category =
                 mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
@@ -95,6 +119,18 @@
     }
 
     @Override
+    public void setDivider(Drawable divider) {
+        if (mDashboardFeatureProvider.isEnabled()) {
+            // Intercept divider and set it transparent so system divider decoration is disabled.
+            // We will use our decoration to draw divider more intelligently.
+            mDividerDecoration.setDivider(divider);
+            super.setDivider(new ColorDrawable(Color.TRANSPARENT));
+        } else {
+            super.setDivider(divider);
+        }
+    }
+
+    @Override
     public void onStart() {
         super.onStart();
         final DashboardCategory category =
@@ -116,7 +152,8 @@
     @Override
     public void notifySummaryChanged(Tile tile) {
         final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
-        final Preference pref = findPreference(key);
+        final Preference pref = mProgressiveDisclosureMixin.findPreference(
+                getPreferenceScreen(), key);
         if (pref == null) {
             Log.d(getLogTag(),
                     String.format("Can't find pref by key %s, skipping update summary %s/%s",
@@ -206,14 +243,56 @@
     }
 
     /**
-     * Displays dashboard tiles as preference.
+     * Update state of each preference managed by PreferenceController.
      */
-    private final void displayDashboardTiles(final String TAG, PreferenceScreen screen) {
+    private void updatePreferenceStates() {
+        Collection<PreferenceController> controllers = mPreferenceControllers.values();
+        final PreferenceScreen screen = getPreferenceScreen();
+        for (PreferenceController controller : controllers) {
+            if (!controller.isAvailable()) {
+                continue;
+            }
+            final String key = controller.getPreferenceKey();
+
+            final Preference preference = mProgressiveDisclosureMixin.findPreference(screen, key);
+            if (preference == null) {
+                Log.d(TAG, String.format("Cannot find preference with key %s in Controller %s",
+                        key, controller.getClass().getSimpleName()));
+                continue;
+            }
+            controller.updateState(preference);
+        }
+    }
+
+    /**
+     * Refresh all preference items, including both static prefs from xml, and dynamic items from
+     * DashboardCategory.
+     */
+    private void refreshAllPreferences(final String TAG) {
+        // First remove old preferences.
+        if (getPreferenceScreen() != null) {
+            // Intentionally do not cache PreferenceScreen because it will be recreated later.
+            getPreferenceScreen().removeAll();
+        }
+
+        // Add resource based tiles.
+        displayResourceTiles();
+
+        refreshDashboardTiles(TAG);
+    }
+
+    /**
+     * Refresh preference items backed by DashboardCategory.
+     */
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    void refreshDashboardTiles(final String TAG) {
+        final PreferenceScreen screen = getPreferenceScreen();
+
         final Context context = getContext();
         final DashboardCategory category =
                 mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
         if (category == null) {
-            Log.d(TAG, "NO dynamic tiles for " + TAG);
+            Log.d(TAG, "NO dashboard tiles for " + TAG);
             return;
         }
         List<Tile> tiles = category.tiles;
@@ -221,6 +300,9 @@
             Log.d(TAG, "tile list is empty, skipping category " + category.title);
             return;
         }
+        // Create a list to track which tiles are to be removed.
+        final List<String> remove = new ArrayList<>(mDashboardTilePrefKeys);
+
         // There are dashboard tiles, so we need to install SummaryLoader.
         if (mSummaryLoader != null) {
             mSummaryLoader.release();
@@ -234,91 +316,25 @@
                 Log.d(TAG, "tile does not contain a key, skipping " + tile);
                 continue;
             }
-            mDashboardTilePrefKeys.add(key);
-            final Preference pref = new DashboardTilePreference(context);
-            pref.setTitle(tile.title);
-            pref.setKey(key);
-            pref.setSummary(tile.summary);
-            if (tile.icon != null) {
-                pref.setIcon(tile.icon.loadDrawable(context));
+            if (mDashboardTilePrefKeys.contains(key)) {
+                // Have the key already, will rebind.
+                final Preference preference = mProgressiveDisclosureMixin.findPreference(
+                        screen, key);
+                mDashboardFeatureProvider.bindPreferenceToTile(
+                        getActivity(), preference, tile, key);
+            } else {
+                // Don't have this key, add it.
+                final Preference pref = new DashboardTilePreference(context);
+                mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), pref, tile, key);
+                mProgressiveDisclosureMixin.addPreference(screen, pref);
+                mDashboardTilePrefKeys.add(key);
             }
-            final Bundle metadata = tile.metaData;
-            if (metadata != null) {
-                String clsName = metadata.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
-                if (!TextUtils.isEmpty(clsName)) {
-                    pref.setFragment(clsName);
-                }
-            } else if (tile.intent != null) {
-                final Intent intent = new Intent(tile.intent);
-                pref.setOnPreferenceClickListener(preference -> {
-                    getActivity().startActivityForResult(intent, 0);
-                    return true;
-                });
-            }
-            // Use negated priority for order, because tile priority is based on intent-filter
-            // (larger value has higher priority). However pref order defines smaller value has
-            // higher priority.
-            pref.setOrder(-tile.priority);
-            screen.addPreference(pref);
+            remove.remove(key);
         }
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        final View view = super.onCreateView(inflater, container, savedInstanceState);
-        getListView().addItemDecoration(mDividerDecoration);
-        return view;
-    }
-
-    /**
-     * Update state of each preference managed by PreferenceController.
-     */
-    private void updatePreferenceStates() {
-        Collection<PreferenceController> controllers = mPreferenceControllers.values();
-        final PreferenceScreen screen = getPreferenceScreen();
-        for (PreferenceController controller : controllers) {
-            controller.updateState(screen);
+        // Finally remove tiles that are gone.
+        for (String key : remove) {
+            mDashboardTilePrefKeys.remove(key);
+            mProgressiveDisclosureMixin.removePreference(screen, key);
         }
     }
-
-    @Override
-    public void setDivider(Drawable divider) {
-        // Intercept divider and set it transparent so system divider decoration is disabled.
-        // We will use our decoration to draw divider more intelligently.
-        mDividerDecoration.setDivider(divider);
-        super.setDivider(new ColorDrawable(Color.TRANSPARENT));
-    }
-
-    /**
-     * Refresh all preference items, including both static prefs from xml, and dynamic items from
-     * DashboardCategory.
-     */
-    private void refreshAllPreferences(final String TAG) {
-        // First remove old preferences.
-        final PreferenceScreen screen = getPreferenceScreen();
-        if (screen != null) {
-            screen.removeAll();
-        }
-
-        // Add resource based tiles.
-        displayResourceTiles();
-
-        refreshDashboardTiles(TAG);
-    }
-
-    /**
-     * Refresh preference items backed by DashboardCategory.
-     */
-    private void refreshDashboardTiles(final String TAG) {
-        final PreferenceScreen screen = getPreferenceScreen();
-        for (String key : mDashboardTilePrefKeys) {
-            final Preference pref = screen.findPreference(key);
-            if (pref != null) {
-                screen.removePreference(pref);
-            }
-        }
-        mDashboardTilePrefKeys.clear();
-        displayDashboardTiles(TAG, getPreferenceScreen());
-    }
 }
diff --git a/src/com/android/settings/dashboard/ExpandPreference.java b/src/com/android/settings/dashboard/ExpandPreference.java
new file mode 100644
index 0000000..215bfc5
--- /dev/null
+++ b/src/com/android/settings/dashboard/ExpandPreference.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.util.AttributeSet;
+
+import com.android.settings.R;
+
+public class ExpandPreference extends Preference {
+
+    public ExpandPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init();
+    }
+
+    public ExpandPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    public ExpandPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public ExpandPreference(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setLayoutResource(R.layout.expand_preference);
+        setTitle(R.string.wifi_more);
+        setOrder(999);
+    }
+}
diff --git a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java
new file mode 100644
index 0000000..75251b3
--- /dev/null
+++ b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnCreate;
+import com.android.settings.core.lifecycle.events.OnSaveInstanceState;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickListener,
+        LifecycleObserver, OnCreate, OnSaveInstanceState {
+
+    private static final String TAG = "ProgressiveDisclosure";
+    private static final String STATE_USER_EXPANDED = "state_user_expanded";
+    private static final int DEFAULT_TILE_LIMIT = 3;
+
+    private int mTileLimit = DEFAULT_TILE_LIMIT;
+
+    private final DashboardFeatureProvider mDashboardFeatureProvider;
+    // Collapsed preference sorted by order.
+    private final List<Preference> mCollapsedPrefs = new ArrayList<>();
+    private final ExpandPreference mExpandButton;
+    private final PreferenceFragment mFragment;
+
+    private boolean mUserExpanded;
+
+    public ProgressiveDisclosureMixin(Context context,
+            DashboardFeatureProvider dashboardFeatureProvider, PreferenceFragment fragment) {
+        mFragment = fragment;
+        mExpandButton = new ExpandPreference(context);
+        mExpandButton.setOnPreferenceClickListener(this);
+        mDashboardFeatureProvider = dashboardFeatureProvider;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        if (savedInstanceState != null) {
+            mUserExpanded = savedInstanceState.getBoolean(STATE_USER_EXPANDED, false);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        outState.putBoolean(STATE_USER_EXPANDED, mUserExpanded);
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        if (preference instanceof ExpandPreference) {
+            final PreferenceScreen screen = mFragment.getPreferenceScreen();
+            if (screen != null) {
+                screen.removePreference(preference);
+                for (Preference pref : mCollapsedPrefs) {
+                    screen.addPreference(pref);
+                }
+                mCollapsedPrefs.clear();
+                mUserExpanded = true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Sets the threshold to start collapsing preferences when there are too many.
+     */
+    public void setTileLimit(int limit) {
+        mTileLimit = limit;
+    }
+
+    /**
+     * Whether the controller is in collapsed state.
+     */
+    public boolean isCollapsed() {
+        return !mCollapsedPrefs.isEmpty();
+    }
+
+    /**
+     * Whether the screen should be collapsed.
+     */
+    public boolean shouldCollapse(PreferenceScreen screen) {
+        return mDashboardFeatureProvider.isEnabled() && screen.getPreferenceCount() >= mTileLimit
+                && !mUserExpanded;
+    }
+
+    /**
+     * Collapse extra preferences and show a "More" button
+     */
+    public void collapse(PreferenceScreen screen) {
+        final int itemCount = screen.getPreferenceCount();
+        if (!shouldCollapse(screen)) {
+            return;
+        }
+        if (!mCollapsedPrefs.isEmpty()) {
+            Log.w(TAG, "collapsed list should ALWAYS BE EMPTY before collapsing!");
+        }
+
+        for (int i = itemCount - 1; i >= mTileLimit; i--) {
+            final Preference preference = screen.getPreference(i);
+            addToCollapsedList(preference);
+            screen.removePreference(preference);
+        }
+        screen.addPreference(mExpandButton);
+    }
+
+    /**
+     * Adds preference to screen. If there are too many preference on screen, adds it to
+     * collapsed list instead.
+     */
+    public void addPreference(PreferenceScreen screen, Preference pref) {
+        // Either add to screen, or to collapsed list.
+        if (isCollapsed()) {
+            // insert the preference to right position.
+            final int lastPreferenceIndex = screen.getPreferenceCount() - 2;
+            if (lastPreferenceIndex >= 0) {
+                final Preference lastPreference = screen.getPreference(lastPreferenceIndex);
+                if (lastPreference.getOrder() > pref.getOrder()) {
+                    // insert to screen and move the last pref to collapsed list.
+                    screen.removePreference(lastPreference);
+                    screen.addPreference(pref);
+                    addToCollapsedList(lastPreference);
+                } else {
+                    // Insert to collapsed list.
+                    addToCollapsedList(pref);
+                }
+            } else {
+                // Couldn't find last preference on screen, just add to collapsed list.
+                addToCollapsedList(pref);
+            }
+        } else if (shouldCollapse(screen)) {
+            // About to have too many tiles on scree, collapse and add pref to collapsed list.
+            screen.addPreference(pref);
+            collapse(screen);
+        } else {
+            // No need to collapse, add to screen directly.
+            screen.addPreference(pref);
+        }
+    }
+
+    /**
+     * Removes preference. If the preference is on screen, remove it from screen. If the
+     * preference is in collapsed list, remove it from list.
+     */
+    public void removePreference(PreferenceScreen screen, String key) {
+        // Try removing from screen.
+        final Preference preference = screen.findPreference(key);
+        if (preference != null) {
+            screen.removePreference(preference);
+            return;
+        }
+        // Didn't find on screen, try removing from collapsed list.
+        for (int i = 0; i < mCollapsedPrefs.size(); i++) {
+            final Preference pref = mCollapsedPrefs.get(i);
+            if (TextUtils.equals(key, pref.getKey())) {
+                mCollapsedPrefs.remove(pref);
+                if (mCollapsedPrefs.isEmpty()) {
+                    // Removed last element, remove expand button too.
+                    screen.removePreference(mExpandButton);
+                }
+                return;
+            }
+        }
+    }
+
+    /**
+     * Finds preference by key, either from screen or from collapsed list.
+     */
+    public Preference findPreference(PreferenceScreen screen, CharSequence key) {
+        Preference preference = screen.findPreference(key);
+        if (preference != null) {
+            return preference;
+        }
+        for (int i = 0; i < mCollapsedPrefs.size(); i++) {
+            final Preference pref = mCollapsedPrefs.get(i);
+            if (TextUtils.equals(key, pref.getKey())) {
+                return pref;
+            }
+        }
+        Log.d(TAG, "Cannot find preference with key " + key);
+        return null;
+    }
+
+    /**
+     * Add preference to collapsed list.
+     */
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    void addToCollapsedList(Preference preference) {
+        // Insert preference based on it's order.
+        int insertionIndex = Collections.binarySearch(mCollapsedPrefs, preference);
+        if (insertionIndex < 0) {
+            insertionIndex = insertionIndex * -1 - 1;
+        }
+        mCollapsedPrefs.add(insertionIndex, preference);
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    List<Preference> getCollapsedPrefs() {
+        return mCollapsedPrefs;
+    }
+}
diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java b/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java
index 0c16527..3d13fde 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java
@@ -81,9 +81,17 @@
         View detailGroup = view.itemView.findViewById(R.id.detail_group);
         CharSequence[] actions = condition.getActions();
         if (isExpanded != (detailGroup.getVisibility() == View.VISIBLE)) {
-            animateChange(view.itemView, view.itemView.findViewById(R.id.content),
-                    detailGroup, isExpanded, actions.length > 0);
+            if (isExpanded) {
+                final boolean hasButtons = actions.length > 0;
+                setViewVisibility(detailGroup, R.id.divider, hasButtons);
+                setViewVisibility(detailGroup, R.id.buttonBar, hasButtons);
+
+                detailGroup.setVisibility(View.VISIBLE);
+            } else {
+                detailGroup.setVisibility(View.GONE);
+            }
         }
+
         if (isExpanded) {
             view.summary.setText(condition.getSummary());
             for (int i = 0; i < 2; i++) {
@@ -110,37 +118,6 @@
         }
     }
 
-    private static void animateChange(final View view, final View content,
-            final View detailGroup, final boolean visible, final boolean hasButtons) {
-        setViewVisibility(detailGroup, R.id.divider, hasButtons);
-        setViewVisibility(detailGroup, R.id.buttonBar, hasButtons);
-        final int beforeBottom = content.getBottom();
-        setHeight(detailGroup, visible ? LayoutParams.WRAP_CONTENT : 0);
-        detailGroup.setVisibility(View.VISIBLE);
-        view.addOnLayoutChangeListener(new OnLayoutChangeListener() {
-            public static final long DURATION = 250;
-
-            @Override
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                final int afterBottom = content.getBottom();
-                v.removeOnLayoutChangeListener(this);
-                final ObjectAnimator animator = ObjectAnimator.ofInt(content, "bottom",
-                        beforeBottom, afterBottom);
-                animator.setDuration(DURATION);
-                animator.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        if (!visible) {
-                            detailGroup.setVisibility(View.GONE);
-                        }
-                    }
-                });
-                animator.start();
-            }
-        });
-    }
-
     private static void setHeight(View detailGroup, int height) {
         final LayoutParams params = detailGroup.getLayoutParams();
         params.height = height;
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index e284bed..c99a4ab 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -77,6 +77,11 @@
     private int mDataUsageTemplate;
 
     @Override
+    protected int getHelpResource() {
+        return R.string.help_url_data_usage;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
index 6dd6aba..3435b53 100644
--- a/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
@@ -34,13 +34,13 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mContext.getResources().getBoolean(
                 com.android.settings.R.bool.config_additional_system_update_setting_enable);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_UPDATE_SETTING;
     }
 }
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
new file mode 100644
index 0000000..d118a45
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2016 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.deviceinfo;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import com.android.settings.ChooseLockSettingsHelper;
+import com.android.settings.DevelopmentSettings;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnResume;
+import com.android.settings.search.Index;
+import com.android.settingslib.RestrictedLockUtils;
+
+public class BuildNumberPreferenceController extends PreferenceController
+        implements LifecycleObserver, OnResume {
+
+    static final int TAPS_TO_BE_A_DEVELOPER = 7;
+    static final int REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF = 100;
+
+    private static final String KEY_BUILD_NUMBER = "build_number";
+
+    private final Activity mActivity;
+    private final Fragment mFragment;
+    private final UserManager mUm;
+
+    private Toast mDevHitToast;
+    private RestrictedLockUtils.EnforcedAdmin mDebuggingFeaturesDisallowedAdmin;
+    private boolean mDebuggingFeaturesDisallowedBySystem;
+    private int mDevHitCountdown;
+    private boolean mProcessingLastDevHit;
+
+    public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment) {
+        super(context);
+        mActivity = activity;
+        mFragment = fragment;
+        mUm = UserManager.get(activity);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final Preference preference = screen.findPreference(KEY_BUILD_NUMBER);
+        if (preference != null) {
+            try {
+                preference.setSummary(Build.DISPLAY);
+                preference.setEnabled(true);
+            } catch (Exception e) {
+                preference.setSummary(R.string.device_info_default);
+            }
+        }
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_BUILD_NUMBER;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public void onResume() {
+        mDebuggingFeaturesDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
+        mDebuggingFeaturesDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(
+                mContext, UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
+        mDevHitCountdown = mContext.getSharedPreferences(DevelopmentSettings.PREF_FILE,
+                Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW,
+                android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER;
+        mDevHitToast = null;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!TextUtils.equals(preference.getKey(), KEY_BUILD_NUMBER)) {
+            return false;
+        }
+        // Don't enable developer options for secondary users.
+        if (!mUm.isAdminUser()) {
+            return false;
+        }
+
+        // Don't enable developer options until device has been provisioned
+        if (!Utils.isDeviceProvisioned(mContext)) {
+            return false;
+        }
+
+        if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
+            if (mDebuggingFeaturesDisallowedAdmin != null &&
+                    !mDebuggingFeaturesDisallowedBySystem) {
+                RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext,
+                        mDebuggingFeaturesDisallowedAdmin);
+            }
+            return false;
+        }
+
+        if (mDevHitCountdown > 0) {
+            mDevHitCountdown--;
+            if (mDevHitCountdown == 0 && !mProcessingLastDevHit) {
+                // Add 1 count back, then start password confirmation flow.
+                mDevHitCountdown++;
+                final ChooseLockSettingsHelper helper =
+                        new ChooseLockSettingsHelper(mActivity, mFragment);
+                mProcessingLastDevHit = helper.launchConfirmationActivity(
+                        REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
+                        mContext.getString(R.string.unlock_set_unlock_launch_picker_title));
+                if (!mProcessingLastDevHit) {
+                    enableDevelopmentSettings();
+                }
+            } else if (mDevHitCountdown > 0
+                    && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) {
+                if (mDevHitToast != null) {
+                    mDevHitToast.cancel();
+                }
+                mDevHitToast = Toast.makeText(mContext,
+                        mContext.getResources().getQuantityString(
+                                R.plurals.show_dev_countdown, mDevHitCountdown,
+                                mDevHitCountdown),
+                        Toast.LENGTH_SHORT);
+                mDevHitToast.show();
+            }
+        } else if (mDevHitCountdown < 0) {
+            if (mDevHitToast != null) {
+                mDevHitToast.cancel();
+            }
+            mDevHitToast = Toast.makeText(mContext, R.string.show_dev_already,
+                    Toast.LENGTH_LONG);
+            mDevHitToast.show();
+        }
+        return true;
+    }
+
+    /**
+     * Handles password confirmation result.
+     *
+     * @return if activity result is handled.
+     */
+    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode != REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF) {
+            return false;
+        }
+        if (resultCode == Activity.RESULT_OK) {
+            enableDevelopmentSettings();
+        }
+        mProcessingLastDevHit = false;
+        return true;
+    }
+
+    /**
+     * Enables development settings. Only call this after confirming password.
+     */
+    private void enableDevelopmentSettings() {
+        mDevHitCountdown = 0;
+        mProcessingLastDevHit = false;
+        mContext.getSharedPreferences(DevelopmentSettings.PREF_FILE,
+                Context.MODE_PRIVATE).edit()
+                .putBoolean(DevelopmentSettings.PREF_SHOW, true)
+                .apply();
+        if (mDevHitToast != null) {
+            mDevHitToast.cancel();
+        }
+        mDevHitToast = Toast.makeText(mContext, R.string.show_dev_on,
+                Toast.LENGTH_LONG);
+        mDevHitToast.show();
+        // This is good time to index the Developer Options
+        Index.getInstance(
+                mContext.getApplicationContext()).updateFromClassNameResource(
+                DevelopmentSettings.class.getName(), true, true);
+    }
+}
diff --git a/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java b/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java
index add4781..e64525b 100644
--- a/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java
@@ -17,13 +17,10 @@
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 
-import java.util.List;
-
 public class ManageStoragePreferenceController extends PreferenceController {
 
     public static final String KEY_MANAGE_STORAGE = "pref_manage_storage";
@@ -33,7 +30,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_MANAGE_STORAGE;
     }
 
@@ -43,7 +40,7 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mContext.getResources().getBoolean(R.bool.config_storage_manager_settings_enabled);
     }
 }
diff --git a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
index 449847a..0bf43e2 100644
--- a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
@@ -46,12 +46,12 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mUm.isAdminUser();
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_SYSTEM_UPDATE_SETTINGS;
     }
 
diff --git a/src/com/android/settings/display/AutoBrightnessPreferenceController.java b/src/com/android/settings/display/AutoBrightnessPreferenceController.java
index 934ccf2..df2000e 100644
--- a/src/com/android/settings/display/AutoBrightnessPreferenceController.java
+++ b/src/com/android/settings/display/AutoBrightnessPreferenceController.java
@@ -17,7 +17,6 @@
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.core.PreferenceController;
 
@@ -36,13 +35,13 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_automatic_brightness_available);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_AUTO_BRIGHTNESS;
     }
 
@@ -52,15 +51,10 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final SwitchPreference preference =
-                (SwitchPreference) screen.findPreference(KEY_AUTO_BRIGHTNESS);
-        if (preference == null) {
-            return;
-        }
+    public void updateState(Preference preference) {
         int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
                 SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
-        preference.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL);
+        ((SwitchPreference) preference).setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL);
     }
 
     @Override
diff --git a/src/com/android/settings/display/AutoRotatePreferenceController.java b/src/com/android/settings/display/AutoRotatePreferenceController.java
index f28e1d6..567393e 100644
--- a/src/com/android/settings/display/AutoRotatePreferenceController.java
+++ b/src/com/android/settings/display/AutoRotatePreferenceController.java
@@ -17,7 +17,6 @@
 import android.content.res.Configuration;
 import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.logging.MetricsProto;
 import com.android.internal.view.RotationPolicy;
@@ -38,14 +37,13 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_AUTO_ROTATE;
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final DropDownPreference rotatePreference =
-                (DropDownPreference) screen.findPreference(KEY_AUTO_ROTATE);
+    public void updateState(Preference preference) {
+        final DropDownPreference rotatePreference = (DropDownPreference) preference;
         final int rotateLockedResourceId;
         // The following block sets the string used when rotation is locked.
         // If the device locks specifically to portrait or landscape (rather than current
@@ -69,14 +67,13 @@
                 1 : 0);
     }
 
-
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         return false;
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return RotationPolicy.isRotationLockToggleVisible(mContext);
     }
 
diff --git a/src/com/android/settings/display/CameraGesturePreferenceController.java b/src/com/android/settings/display/CameraGesturePreferenceController.java
index 98486c5..a3dc6cf 100644
--- a/src/com/android/settings/display/CameraGesturePreferenceController.java
+++ b/src/com/android/settings/display/CameraGesturePreferenceController.java
@@ -18,7 +18,6 @@
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.core.PreferenceController;
 
@@ -34,7 +33,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_CAMERA_GESTURE;
     }
 
@@ -44,18 +43,14 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final SwitchPreference preference =
-                (SwitchPreference) screen.findPreference(KEY_CAMERA_GESTURE);
-        if (preference != null) {
-            int value = Settings.Secure.getInt(mContext.getContentResolver(),
-                    CAMERA_GESTURE_DISABLED, 0);
-            preference.setChecked(value == 0);
-        }
+    public void updateState(Preference preference) {
+        int value = Settings.Secure.getInt(mContext.getContentResolver(),
+                CAMERA_GESTURE_DISABLED, 0);
+        ((SwitchPreference) preference).setChecked(value == 0);
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         boolean configSet = mContext.getResources().getInteger(
                 com.android.internal.R.integer.config_cameraLaunchGestureSensorType) != -1;
         return configSet
diff --git a/src/com/android/settings/display/DozePreferenceController.java b/src/com/android/settings/display/DozePreferenceController.java
index 9fcc807..16b0e81 100644
--- a/src/com/android/settings/display/DozePreferenceController.java
+++ b/src/com/android/settings/display/DozePreferenceController.java
@@ -19,7 +19,6 @@
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 
 import com.android.settings.core.PreferenceController;
@@ -42,7 +41,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_DOZE;
     }
 
@@ -55,13 +54,9 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final SwitchPreference preference = (SwitchPreference) screen.findPreference(KEY_DOZE);
-        // Update doze if it is available.
-        if (preference != null) {
-            int value = Settings.Secure.getInt(mContext.getContentResolver(), DOZE_ENABLED, 1);
-            preference.setChecked(value != 0);
-        }
+    public void updateState(Preference preference) {
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), DOZE_ENABLED, 1);
+        ((SwitchPreference) preference).setChecked(value != 0);
     }
 
     @Override
@@ -72,7 +67,7 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         String name = Build.IS_DEBUGGABLE ? SystemProperties.get("debug.doze.component") : null;
         if (TextUtils.isEmpty(name)) {
             name = mContext.getResources().getString(
diff --git a/src/com/android/settings/display/FontSizePreferenceController.java b/src/com/android/settings/display/FontSizePreferenceController.java
index 9981fcd..5014bda 100644
--- a/src/com/android/settings/display/FontSizePreferenceController.java
+++ b/src/com/android/settings/display/FontSizePreferenceController.java
@@ -17,7 +17,6 @@
 import android.content.res.Resources;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.accessibility.ToggleFontSizePreferenceFragment;
@@ -32,21 +31,17 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return true;
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_FONT_SIZE;
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final Preference preference = screen.findPreference(KEY_FONT_SIZE);
-        if (preference == null) {
-            return;
-        }
+    public void updateState(Preference preference) {
         final float currentScale = Settings.System.getFloat(mContext.getContentResolver(),
                 Settings.System.FONT_SCALE, 1.0f);
         final Resources res = mContext.getResources();
diff --git a/src/com/android/settings/display/LiftToWakePreferenceController.java b/src/com/android/settings/display/LiftToWakePreferenceController.java
index 0b573cf..81ba5f5 100644
--- a/src/com/android/settings/display/LiftToWakePreferenceController.java
+++ b/src/com/android/settings/display/LiftToWakePreferenceController.java
@@ -19,7 +19,6 @@
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.core.PreferenceController;
 
@@ -35,13 +34,13 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         SensorManager sensors = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
         return sensors != null && sensors.getDefaultSensor(Sensor.TYPE_WAKE_GESTURE) != null;
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_LIFT_TO_WAKE;
     }
 
@@ -58,13 +57,8 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final SwitchPreference pref = (SwitchPreference) screen.findPreference(KEY_LIFT_TO_WAKE);
-        // Update lift-to-wake if it is available.
-        if (pref != null) {
-            int value =
-                    Settings.Secure.getInt(mContext.getContentResolver(), WAKE_GESTURE_ENABLED, 0);
-            pref.setChecked(value != 0);
-        }
+    public void updateState(Preference preference) {
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), WAKE_GESTURE_ENABLED, 0);
+        ((SwitchPreference) preference).setChecked(value != 0);
     }
 }
diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java
index d7191d2..9cf2409 100644
--- a/src/com/android/settings/display/NightDisplayPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayPreferenceController.java
@@ -33,12 +33,12 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return NightDisplayController.isAvailable(mContext);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_NIGHT_DISPLAY;
     }
 }
diff --git a/src/com/android/settings/display/NightModePreferenceController.java b/src/com/android/settings/display/NightModePreferenceController.java
index 7b3c584..874d84f 100644
--- a/src/com/android/settings/display/NightModePreferenceController.java
+++ b/src/com/android/settings/display/NightModePreferenceController.java
@@ -35,12 +35,12 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return false;
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_NIGHT_MODE;
     }
 
diff --git a/src/com/android/settings/display/ScreenSaverPreferenceController.java b/src/com/android/settings/display/ScreenSaverPreferenceController.java
index 6376fcf..7335b1f 100644
--- a/src/com/android/settings/display/ScreenSaverPreferenceController.java
+++ b/src/com/android/settings/display/ScreenSaverPreferenceController.java
@@ -15,7 +15,6 @@
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.DreamSettings;
 import com.android.settings.core.PreferenceController;
@@ -29,13 +28,13 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_dreamsSupported);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_SCREEN_SAVER;
     }
 
@@ -45,11 +44,7 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final Preference preference = screen.findPreference(KEY_SCREEN_SAVER);
-        if (preference != null) {
-            preference.setSummary(
-                    DreamSettings.getSummaryTextWithDreamName(mContext));
-        }
+    public void updateState(Preference preference) {
+        preference.setSummary(DreamSettings.getSummaryTextWithDreamName(mContext));
     }
 }
diff --git a/src/com/android/settings/display/TapToWakePreferenceController.java b/src/com/android/settings/display/TapToWakePreferenceController.java
index 6d1681f..18c877a 100644
--- a/src/com/android/settings/display/TapToWakePreferenceController.java
+++ b/src/com/android/settings/display/TapToWakePreferenceController.java
@@ -17,7 +17,6 @@
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.core.PreferenceController;
 
@@ -31,12 +30,12 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_TAP_TO_WAKE;
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_supportDoubleTapWake);
     }
@@ -47,14 +46,10 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final SwitchPreference preference =
-                (SwitchPreference) screen.findPreference(KEY_TAP_TO_WAKE);
-        if (preference != null) {
-            int value = Settings.Secure.getInt(
-                    mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, 0);
-            preference.setChecked(value != 0);
-        }
+    public void updateState(Preference preference) {
+        int value = Settings.Secure.getInt(
+                mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, 0);
+        ((SwitchPreference) preference).setChecked(value != 0);
     }
 
     @Override
diff --git a/src/com/android/settings/display/TimeoutPreferenceController.java b/src/com/android/settings/display/TimeoutPreferenceController.java
index 1295a47..d33f813 100644
--- a/src/com/android/settings/display/TimeoutPreferenceController.java
+++ b/src/com/android/settings/display/TimeoutPreferenceController.java
@@ -18,7 +18,6 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
 
 import com.android.settings.R;
@@ -43,12 +42,12 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return true;
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_SCREEN_TIMEOUT;
     }
 
@@ -58,15 +57,11 @@
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final TimeoutListPreference preference =
-                (TimeoutListPreference) screen.findPreference(KEY_SCREEN_TIMEOUT);
-        if (preference == null) {
-            return;
-        }
+    public void updateState(Preference preference) {
+        final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preference;
         final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
                 SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
-        preference.setValue(String.valueOf(currentTimeout));
+        timeoutListPreference.setValue(String.valueOf(currentTimeout));
         final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
         if (dpm != null) {
@@ -74,9 +69,9 @@
                     RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext);
             final long maxTimeout =
                     dpm.getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId());
-            preference.removeUnusableTimeouts(maxTimeout, admin);
+            timeoutListPreference.removeUnusableTimeouts(maxTimeout, admin);
         }
-        updateTimeoutPreferenceDescription(preference, currentTimeout);
+        updateTimeoutPreferenceDescription(timeoutListPreference, currentTimeout);
     }
 
     @Override
diff --git a/src/com/android/settings/display/VrDisplayPreferenceController.java b/src/com/android/settings/display/VrDisplayPreferenceController.java
index c340759..61c3ed2 100644
--- a/src/com/android/settings/display/VrDisplayPreferenceController.java
+++ b/src/com/android/settings/display/VrDisplayPreferenceController.java
@@ -19,7 +19,6 @@
 import android.provider.Settings;
 import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
 
 import com.android.settings.R;
@@ -36,24 +35,19 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         final PackageManager pm = mContext.getPackageManager();
         return pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_VR_DISPLAY_PREF;
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        final DropDownPreference pref =
-                (DropDownPreference) screen.findPreference(KEY_VR_DISPLAY_PREF);
-        if (pref == null) {
-            Log.d(TAG, "Could not find VR display preference.");
-            return;
-        }
+    public void updateState(Preference preference) {
+        final DropDownPreference pref = (DropDownPreference) preference;
         pref.setEntries(new CharSequence[]{
                 mContext.getString(R.string.display_vr_pref_low_persistence),
                 mContext.getString(R.string.display_vr_pref_off),
diff --git a/src/com/android/settings/display/WallpaperPreferenceController.java b/src/com/android/settings/display/WallpaperPreferenceController.java
index 32e9abc..8352377 100644
--- a/src/com/android/settings/display/WallpaperPreferenceController.java
+++ b/src/com/android/settings/display/WallpaperPreferenceController.java
@@ -16,7 +16,6 @@
 import android.content.Context;
 import android.os.UserHandle;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.core.PreferenceController;
 import com.android.settingslib.RestrictedLockUtils;
@@ -33,18 +32,18 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return true;
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_WALLPAPER;
     }
 
     @Override
-    public void updateState(PreferenceScreen screen) {
-        disablePreferenceIfManaged(screen);
+    public void updateState(Preference preference) {
+        disablePreferenceIfManaged((RestrictedPreference) preference);
     }
 
     @Override
@@ -52,9 +51,7 @@
         return false;
     }
 
-    private void disablePreferenceIfManaged(PreferenceScreen screen) {
-        final RestrictedPreference pref =
-                (RestrictedPreference) screen.findPreference(KEY_WALLPAPER);
+    private void disablePreferenceIfManaged(RestrictedPreference pref) {
         final String restriction = DISALLOW_SET_WALLPAPER;
         if (pref != null) {
             pref.setDisabledByAdmin(null);
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
index cd56458..fa108bb 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
@@ -23,13 +23,12 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.res.ColorStateList;
 import android.graphics.drawable.Animatable2;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -37,7 +36,6 @@
 import android.view.View;
 import android.view.animation.AnimationUtils;
 import android.view.animation.Interpolator;
-import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
@@ -75,7 +73,6 @@
     private static final int ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN = 3;
 
     private ProgressBar mProgressBar;
-    private ImageView mFingerprintAnimator;
     private ObjectAnimator mProgressAnim;
     private TextView mStartMessage;
     private TextView mRepeatMessage;
@@ -87,6 +84,7 @@
     private FingerprintEnrollSidecar mSidecar;
     private boolean mAnimationCancelled;
     private AnimatedVectorDrawable mIconAnimationDrawable;
+    private Drawable mIconBackgroundDrawable;
     private int mIndicatorBackgroundRestingColor;
     private int mIndicatorBackgroundActivatedColor;
     private boolean mRestoring;
@@ -100,8 +98,11 @@
         mRepeatMessage = (TextView) findViewById(R.id.repeat_message);
         mErrorText = (TextView) findViewById(R.id.error_text);
         mProgressBar = (ProgressBar) findViewById(R.id.fingerprint_progress_bar);
-        mFingerprintAnimator = (ImageView) findViewById(R.id.fingerprint_animator);
-        mIconAnimationDrawable = (AnimatedVectorDrawable) mFingerprintAnimator.getDrawable();
+        final LayerDrawable fingerprintDrawable = (LayerDrawable) mProgressBar.getBackground();
+        mIconAnimationDrawable = (AnimatedVectorDrawable)
+                fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_animation);
+        mIconBackgroundDrawable =
+                fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_background);
         mIconAnimationDrawable.registerAnimationCallback(mIconAnimationCallback);
         mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(
                 this, android.R.interpolator.fast_out_slow_in);
@@ -109,7 +110,7 @@
                 this, android.R.interpolator.linear_out_slow_in);
         mFastOutLinearInInterpolator = AnimationUtils.loadInterpolator(
                 this, android.R.interpolator.fast_out_linear_in);
-        mFingerprintAnimator.setOnTouchListener(new View.OnTouchListener() {
+        mProgressBar.setOnTouchListener(new View.OnTouchListener() {
             @Override
             public boolean onTouch(View v, MotionEvent event) {
                 if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
@@ -117,12 +118,12 @@
                     if (mIconTouchCount == ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN) {
                         showIconTouchDialog();
                     } else {
-                        mFingerprintAnimator.postDelayed(mShowDialogRunnable,
+                        mProgressBar.postDelayed(mShowDialogRunnable,
                                 ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN);
                     }
                 } else if (event.getActionMasked() == MotionEvent.ACTION_CANCEL
                         || event.getActionMasked() == MotionEvent.ACTION_UP) {
-                    mFingerprintAnimator.removeCallbacks(mShowDialogRunnable);
+                    mProgressBar.removeCallbacks(mShowDialogRunnable);
                 }
                 return true;
             }
@@ -131,6 +132,7 @@
                 = getColor(R.color.fingerprint_indicator_background_resting);
         mIndicatorBackgroundActivatedColor
                 = getColor(R.color.fingerprint_indicator_background_activated);
+        mIconBackgroundDrawable.setTint(mIndicatorBackgroundRestingColor);
         mRestoring = savedInstanceState != null;
     }
 
@@ -213,8 +215,7 @@
                 new ValueAnimator.AnimatorUpdateListener() {
             @Override
             public void onAnimationUpdate(ValueAnimator animation) {
-                mFingerprintAnimator.setBackgroundTintList(ColorStateList.valueOf(
-                        (Integer) animation.getAnimatedValue()));
+                mIconBackgroundDrawable.setTint((Integer) animation.getAnimatedValue());
             }
         };
         anim.addUpdateListener(listener);
@@ -400,7 +401,7 @@
             }
 
             // Start animation after it has ended.
-            mFingerprintAnimator.post(new Runnable() {
+            mProgressBar.post(new Runnable() {
                 @Override
                 public void run() {
                     startIconAnimation();
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index b0e6969..aa71252 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -22,6 +22,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.UserInfo;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
@@ -45,6 +46,8 @@
     public static final int MSG_UPDATE_NAME_ICON = 1;
     public static final int MSG_REPORT_FULLY_DRAWN = 2;
 
+    private static final String TAG = "BatteryEntry";
+
     static final HashMap<String,UidToDetail> sUidCache = new HashMap<String,UidToDetail>();
 
     static final ArrayList<BatteryEntry> mRequestQueue = new ArrayList<BatteryEntry>();
@@ -160,7 +163,23 @@
                 iconId = R.drawable.ic_settings_display;
                 break;
             case APP:
-                name = sipper.packageWithHighestDrain;
+                PackageManager pm = context.getPackageManager();
+                sipper.mPackages = pm.getPackagesForUid(sipper.uidObj.getUid());
+                // Apps should only have one package
+                if (sipper.mPackages == null || sipper.mPackages.length != 1) {
+                    name = sipper.packageWithHighestDrain;
+                } else {
+                    defaultPackageName = pm.getPackagesForUid(sipper.uidObj.getUid())[0];
+                    try {
+                        ApplicationInfo appInfo =
+                            pm.getApplicationInfo(defaultPackageName, 0 /* no flags */);
+                        name = pm.getApplicationLabel(appInfo).toString();
+                    } catch (NameNotFoundException e) {
+                        Log.d(TAG, "PackageManager failed to retrieve ApplicationInfo for: "
+                            + defaultPackageName);
+                        name = defaultPackageName;
+                    }
+                }
                 break;
             case USER: {
                 UserInfo info = um.getUserInfo(sipper.userId);
@@ -246,7 +265,9 @@
 
         PackageManager pm = context.getPackageManager();
         final int uid = sipper.uidObj.getUid();
-        sipper.mPackages = pm.getPackagesForUid(uid);
+        if (sipper.mPackages == null) {
+            sipper.mPackages = pm.getPackagesForUid(uid);
+        }
         if (sipper.mPackages != null) {
             String[] packageLabels = new String[sipper.mPackages.length];
             System.arraycopy(sipper.mPackages, 0, packageLabels, 0, sipper.mPackages.length);
@@ -259,7 +280,7 @@
                     final ApplicationInfo ai = ipm.getApplicationInfo(packageLabels[i],
                             0 /* no flags */, userId);
                     if (ai == null) {
-                        Log.d(PowerUsageSummary.TAG, "Retrieving null app info for package "
+                        Log.d(TAG, "Retrieving null app info for package "
                                 + packageLabels[i] + ", user " + userId);
                         continue;
                     }
@@ -273,7 +294,7 @@
                         break;
                     }
                 } catch (RemoteException e) {
-                    Log.d(PowerUsageSummary.TAG, "Error while retrieving app info for package "
+                    Log.d(TAG, "Error while retrieving app info for package "
                             + packageLabels[i] + ", user " + userId, e);
                 }
             }
@@ -286,7 +307,7 @@
                     try {
                         final PackageInfo pi = ipm.getPackageInfo(pkgName, 0 /* no flags */, userId);
                         if (pi == null) {
-                            Log.d(PowerUsageSummary.TAG, "Retrieving null package info for package "
+                            Log.d(TAG, "Retrieving null package info for package "
                                     + pkgName + ", user " + userId);
                             continue;
                         }
@@ -303,7 +324,7 @@
                             }
                         }
                     } catch (RemoteException e) {
-                        Log.d(PowerUsageSummary.TAG, "Error while retrieving package info for package "
+                        Log.d(TAG, "Error while retrieving package info for package "
                                 + pkgName + ", user " + userId, e);
                     }
                 }
diff --git a/src/com/android/settings/gestures/GesturePreference.java b/src/com/android/settings/gestures/GesturePreference.java
index 1909dcd..5a64a5a 100644
--- a/src/com/android/settings/gestures/GesturePreference.java
+++ b/src/com/android/settings/gestures/GesturePreference.java
@@ -150,6 +150,10 @@
                         playButton.setVisibility(View.VISIBLE);
                     }
                 }
+                if (mMediaPlayer != null && !mMediaPlayer.isPlaying() &&
+                        playButton.getVisibility() != View.VISIBLE) {
+                    playButton.setVisibility(View.VISIBLE);
+                }
             }
         });
 
@@ -175,4 +179,10 @@
         }
     }
 
+    void onViewInvisible() {
+        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+            mMediaPlayer.pause();
+        }
+    }
+
 }
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index ad9955c..c68d922 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -20,9 +20,8 @@
 import android.content.res.Resources;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
-import android.os.Build;
 import android.os.Bundle;
-import android.os.SystemProperties;
+import android.os.UserHandle;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings.Secure;
 import android.support.v7.preference.Preference;
@@ -32,11 +31,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.internal.hardware.AmbientDisplayConfiguration;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
-import com.android.settings.SettingsPreferenceFragment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -53,17 +53,21 @@
     private static final String PREF_KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power";
     private static final String PREF_KEY_DOUBLE_TWIST = "gesture_double_twist";
     private static final String PREF_KEY_PICK_UP = "gesture_pick_up";
-    private static final String PREF_KEY_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint";
     private static final String PREF_KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen";
     private static final String DEBUG_DOZE_COMPONENT = "debug.doze.component";
 
     private List<GesturePreference> mPreferences;
+    private SwipeToNotificationPreferenceController mSwipeToNotificationPreferenceController;
+
+    private AmbientDisplayConfiguration mAmbientConfig;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.gesture_settings);
         Context context = getActivity();
+        mSwipeToNotificationPreferenceController =
+                new SwipeToNotificationPreferenceController(context);
         mPreferences = new ArrayList();
 
         // Double tap power for camera
@@ -76,26 +80,22 @@
         }
 
         // Ambient Display
-        boolean dozeEnabled = isDozeAvailable(context);
-        if (dozeEnabled && isPickupAvailable(context)) {
-            int pickup = Secure.getInt(getContentResolver(), Secure.DOZE_PULSE_ON_PICK_UP, 1);
-            addPreference(PREF_KEY_PICK_UP, pickup != 0);
+        mAmbientConfig = new AmbientDisplayConfiguration(context);
+        if (mAmbientConfig.pulseOnPickupAvailable()) {
+            boolean pickup = mAmbientConfig.pulseOnPickupEnabled(UserHandle.myUserId());
+            addPreference(PREF_KEY_PICK_UP, pickup);
         } else {
             removePreference(PREF_KEY_PICK_UP);
         }
-        if (dozeEnabled && isDoubleTapAvailable(context)) {
-            int doubleTap = Secure.getInt(getContentResolver(), Secure.DOZE_PULSE_ON_DOUBLE_TAP, 1);
-            addPreference(PREF_KEY_DOUBLE_TAP_SCREEN, doubleTap != 0);
+        if (mAmbientConfig.pulseOnDoubleTapAvailable()) {
+            boolean doubleTap = mAmbientConfig.pulseOnDoubleTapEnabled(UserHandle.myUserId());
+            addPreference(PREF_KEY_DOUBLE_TAP_SCREEN, doubleTap);
         } else {
             removePreference(PREF_KEY_DOUBLE_TAP_SCREEN);
         }
 
         // Fingerprint slide for notifications
-        if (isSystemUINavigationAvailable(context)) {
-            addPreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT, isSystemUINavigationEnabled(context));
-        } else {
-            removePreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT);
-        }
+        mSwipeToNotificationPreferenceController.displayPreference(getPreferenceScreen());
 
         // Double twist for camera mode
         if (isDoubleTwistAvailable(context)) {
@@ -110,7 +110,7 @@
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
+            Bundle savedInstanceState) {
         View view = super.onCreateView(inflater, container, savedInstanceState);
         RecyclerView listview = getListView();
         listview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@@ -135,6 +135,13 @@
     }
 
     @Override
+    public void onResume() {
+        super.onResume();
+        mSwipeToNotificationPreferenceController.updateState(
+                findPreference(mSwipeToNotificationPreferenceController.getPreferenceKey()));
+    }
+
+    @Override
     public void onStart() {
         super.onStart();
         for (GesturePreference preference : mPreferences) {
@@ -143,6 +150,14 @@
     }
 
     @Override
+    public void onStop() {
+        super.onStop();
+        for (GesturePreference preference : mPreferences) {
+            preference.onViewInvisible();
+        }
+    }
+
+    @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         boolean enabled = (boolean) newValue;
         String key = preference.getKey();
@@ -153,9 +168,6 @@
             Secure.putInt(getContentResolver(), Secure.DOZE_PULSE_ON_PICK_UP, enabled ? 1 : 0);
         } else if (PREF_KEY_DOUBLE_TAP_SCREEN.equals(key)) {
             Secure.putInt(getContentResolver(), Secure.DOZE_PULSE_ON_DOUBLE_TAP, enabled ? 1 : 0);
-        } else if (PREF_KEY_SWIPE_DOWN_FINGERPRINT.equals(key)) {
-            Secure.putInt(getContentResolver(),
-                    Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, enabled ? 1 : 0);
         } else if (PREF_KEY_DOUBLE_TWIST.equals(key)) {
             Secure.putInt(getContentResolver(),
                     Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, enabled ? 1 : 0);
@@ -178,35 +190,11 @@
                 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled);
     }
 
-    private static boolean isDozeAvailable(Context context) {
-        String name = Build.IS_DEBUGGABLE ? SystemProperties.get(DEBUG_DOZE_COMPONENT) : null;
-        if (TextUtils.isEmpty(name)) {
-            name = context.getResources().getString(
-                    com.android.internal.R.string.config_dozeComponent);
-        }
-        return !TextUtils.isEmpty(name);
-    }
-
-    private static boolean isSystemUINavigationAvailable(Context context) {
-        return context.getResources().getBoolean(
-                com.android.internal.R.bool.config_supportSystemNavigationKeys);
-    }
-
-    private static boolean isSystemUINavigationEnabled(Context context) {
-        return Secure.getInt(context.getContentResolver(), Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0)
-                == 1;
-    }
-
     private static boolean isDoubleTwistAvailable(Context context) {
         return hasSensor(context, R.string.gesture_double_twist_sensor_name,
                 R.string.gesture_double_twist_sensor_vendor);
     }
 
-    private static boolean isPickupAvailable(Context context) {
-        return hasSensor(context, R.string.gesture_pickup_sensor_name,
-                R.string.gesture_pickup_sensor_vendor);
-    }
-
     private static boolean hasSensor(Context context, int nameResId, int vendorResId) {
         Resources resources = context.getResources();
         String name = resources.getString(nameResId);
@@ -223,11 +211,6 @@
         return false;
     }
 
-    private static boolean isDoubleTapAvailable(Context context) {
-        return context.getResources().getBoolean(
-                R.bool.config_gesture_double_tap_settings_enabled);
-    }
-
     private void addPreference(String key, boolean enabled) {
         GesturePreference preference = (GesturePreference) findPreference(key);
         preference.setChecked(enabled);
@@ -236,40 +219,41 @@
     }
 
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-        new BaseSearchIndexProvider() {
-            @Override
-            public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
-                     boolean enabled) {
-                ArrayList<SearchIndexableResource> result =
-                        new ArrayList<SearchIndexableResource>();
+            new BaseSearchIndexProvider() {
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+                        boolean enabled) {
+                    ArrayList<SearchIndexableResource> result =
+                            new ArrayList<SearchIndexableResource>();
 
-                SearchIndexableResource sir = new SearchIndexableResource(context);
-                sir.xmlResId = R.xml.gesture_settings;
-                result.add(sir);
+                    SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.gesture_settings;
+                    result.add(sir);
 
-                return result;
-            }
+                    return result;
+                }
 
-            @Override
-            public List<String> getNonIndexableKeys(Context context) {
-                ArrayList<String> result = new ArrayList<String>();
-                if (!isCameraDoubleTapPowerGestureAvailable(context.getResources())) {
-                    result.add(PREF_KEY_DOUBLE_TAP_POWER);
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    ArrayList<String> result = new ArrayList<String>();
+                    AmbientDisplayConfiguration ambientConfig
+                            = new AmbientDisplayConfiguration(context);
+                    if (!isCameraDoubleTapPowerGestureAvailable(context.getResources())) {
+                        result.add(PREF_KEY_DOUBLE_TAP_POWER);
+                    }
+                    if (!ambientConfig.pulseOnPickupAvailable()) {
+                        result.add(PREF_KEY_PICK_UP);
+                    }
+                    if (!ambientConfig.pulseOnDoubleTapAvailable()) {
+                        result.add(PREF_KEY_DOUBLE_TAP_SCREEN);
+                    }
+                    new SwipeToNotificationPreferenceController(context)
+                            .updateNonIndexableKeys(result);
+                    if (!isDoubleTwistAvailable(context)) {
+                        result.add(PREF_KEY_DOUBLE_TWIST);
+                    }
+                    return result;
                 }
-                if (!isDozeAvailable(context) || !isPickupAvailable(context)) {
-                    result.add(PREF_KEY_PICK_UP);
-                }
-                if (!isDozeAvailable(context) || !isDoubleTapAvailable(context)) {
-                    result.add(PREF_KEY_DOUBLE_TAP_SCREEN);
-                }
-                if (!isSystemUINavigationAvailable(context)) {
-                    result.add(PREF_KEY_SWIPE_DOWN_FINGERPRINT);
-                }
-                if (!isDoubleTwistAvailable(context)) {
-                    result.add(PREF_KEY_DOUBLE_TWIST);
-                }
-                return result;
-            }
-        };
+            };
 
 }
diff --git a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
new file mode 100644
index 0000000..353eed8
--- /dev/null
+++ b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 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.gestures;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.TwoStatePreference;
+
+import com.android.settings.core.PreferenceController;
+
+public class SwipeToNotificationPreferenceController extends PreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    private static final String PREF_KEY_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint";
+
+    public SwipeToNotificationPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return PREF_KEY_SWIPE_DOWN_FINGERPRINT;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        if (preference != null && preference instanceof TwoStatePreference) {
+            ((TwoStatePreference) preference).setChecked(isSystemUINavigationEnabled());
+        }
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_supportSystemNavigationKeys);
+    }
+
+    private boolean isSystemUINavigationEnabled() {
+        return Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0)
+                == 1;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, (boolean) newValue ? 1 : 0);
+        return true;
+    }
+}
diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java
index c99cd4d..a25c5f8 100644
--- a/src/com/android/settings/network/AirplaneModePreferenceController.java
+++ b/src/com/android/settings/network/AirplaneModePreferenceController.java
@@ -87,12 +87,12 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return !mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEVISION);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_TOGGLE_AIRPLANE;
     }
 
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index 509c771..588d80c 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -45,14 +45,14 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return !mIsSecondaryUser
                 && !Utils.isWifiOnly(mContext)
                 && !hasBaseUserRestriction(mContext, DISALLOW_CONFIG_MOBILE_NETWORKS, myUserId());
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_MOBILE_NETWORK_SETTINGS;
     }
 }
diff --git a/src/com/android/settings/network/MobilePlanPreferenceController.java b/src/com/android/settings/network/MobilePlanPreferenceController.java
index e62686f..42b2bea 100644
--- a/src/com/android/settings/network/MobilePlanPreferenceController.java
+++ b/src/com/android/settings/network/MobilePlanPreferenceController.java
@@ -111,7 +111,7 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         final boolean isPrefAllowedOnDevice = mContext.getResources().getBoolean(
                 com.android.settings.R.bool.config_show_mobile_plan);
         final boolean isPrefAllowedForUser = !mIsSecondaryUser
@@ -120,7 +120,7 @@
         return isPrefAllowedForUser && isPrefAllowedOnDevice;
     }
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_MANAGE_MOBILE_PLAN;
     }
 
diff --git a/src/com/android/settings/network/NetworkResetPreferenceController.java b/src/com/android/settings/network/NetworkResetPreferenceController.java
index 2fe2038..2842139 100644
--- a/src/com/android/settings/network/NetworkResetPreferenceController.java
+++ b/src/com/android/settings/network/NetworkResetPreferenceController.java
@@ -37,13 +37,13 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return !RestrictedLockUtils.hasBaseUserRestriction(mContext,
                 UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId());
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_NETWORK_RESET;
     }
 }
diff --git a/src/com/android/settings/network/ProxyPreferenceController.java b/src/com/android/settings/network/ProxyPreferenceController.java
index 075b1f0..54b8ca9 100644
--- a/src/com/android/settings/network/ProxyPreferenceController.java
+++ b/src/com/android/settings/network/ProxyPreferenceController.java
@@ -36,7 +36,7 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         // proxy UI disabled until we have better app support
         return false;
     }
@@ -54,7 +54,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_PROXY_SETTINGS;
     }
 }
diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java
index b3d55fa..f6ef678 100644
--- a/src/com/android/settings/network/TetherPreferenceController.java
+++ b/src/com/android/settings/network/TetherPreferenceController.java
@@ -67,7 +67,7 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         final boolean isBlocked =
                 (!mConnectivityManager.isTetheringSupported() && !mAdminDisallowedTetherConfig)
                         || hasBaseUserRestriction(mContext, DISALLOW_CONFIG_TETHERING,
@@ -83,7 +83,7 @@
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_TETHER_SETTINGS;
     }
 }
diff --git a/src/com/android/settings/network/VpnPreferenceController.java b/src/com/android/settings/network/VpnPreferenceController.java
index 6e83826..3c4877f 100644
--- a/src/com/android/settings/network/VpnPreferenceController.java
+++ b/src/com/android/settings/network/VpnPreferenceController.java
@@ -58,14 +58,14 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         // TODO: http://b/23693383
         return mIsSecondaryUser || RestrictedLockUtils.hasBaseUserRestriction(mContext,
                 UserManager.DISALLOW_CONFIG_VPN, UserHandle.myUserId());
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_VPN_SETTINGS;
     }
 }
diff --git a/src/com/android/settings/network/WifiCallingPreferenceController.java b/src/com/android/settings/network/WifiCallingPreferenceController.java
index e733b67..5036c46 100644
--- a/src/com/android/settings/network/WifiCallingPreferenceController.java
+++ b/src/com/android/settings/network/WifiCallingPreferenceController.java
@@ -50,13 +50,13 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return ImsManager.isWfcEnabledByPlatform(mContext)
                 && ImsManager.isWfcProvisionedOnDevice(mContext);
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return KEY_WFC_SETTINGS;
     }
 }
diff --git a/src/com/android/settings/nfc/NfcPreferenceController.java b/src/com/android/settings/nfc/NfcPreferenceController.java
index 0d31fe6..6303d5b 100644
--- a/src/com/android/settings/nfc/NfcPreferenceController.java
+++ b/src/com/android/settings/nfc/NfcPreferenceController.java
@@ -101,12 +101,12 @@
     }
 
     @Override
-    protected boolean isAvailable() {
+    public boolean isAvailable() {
         return mNfcAdapter != null;
     }
 
     @Override
-    protected String getPreferenceKey() {
+    public String getPreferenceKey() {
         return null;
     }
 
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index 3f53ec9..1f322d0 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,54 +16,23 @@
 
 package com.android.settings.notification;
 
-import android.app.admin.DevicePolicyManager;
-import android.content.ContentResolver;
 import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.TwoStatePreference;
-import android.util.Log;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
-import com.android.settings.RestrictedListPreference.RestrictedItem;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-import com.android.settingslib.RestrictedLockUtils;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.gestures.SwipeToNotificationPreferenceController;
+import com.android.settings.overlay.FeatureFactory;
 
 import java.util.ArrayList;
+import java.util.List;
 
-import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS;
-import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
-public class ConfigureNotificationSettings extends SettingsPreferenceFragment {
+public class ConfigureNotificationSettings extends DashboardFragment {
     private static final String TAG = "ConfigNotiSettings";
 
-    private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
-    private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "lock_screen_notifications";
-    private static final String KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS =
-            "lock_screen_notifications_profile";
-
-    private final SettingsObserver mSettingsObserver = new SettingsObserver();
-
-    private Context mContext;
-
-    private TwoStatePreference mNotificationPulse;
-    private RestrictedDropDownPreference mLockscreen;
-    private RestrictedDropDownPreference mLockscreenProfile;
-    private boolean mSecure;
-    private boolean mSecureProfile;
-    private int mLockscreenSelectedValue;
-    private int mLockscreenSelectedValueProfile;
-    private int mProfileChallengeUserId;
+    private LockScreenNotificationPreferenceController mLockScreenNotificationController;
 
     @Override
     public int getMetricsCategory() {
@@ -71,310 +40,43 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mContext = getActivity();
-        mProfileChallengeUserId = Utils.getManagedProfileId(
-                UserManager.get(mContext), UserHandle.myUserId());
-
-        final LockPatternUtils utils = new LockPatternUtils(getActivity());
-        final boolean isUnified =
-                !utils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId);
-
-        mSecure = utils.isSecure(UserHandle.myUserId());
-        mSecureProfile = (mProfileChallengeUserId != UserHandle.USER_NULL)
-                && (utils.isSecure(mProfileChallengeUserId) || (isUnified && mSecure));
-
-        addPreferencesFromResource(R.xml.configure_notification_settings);
-
-        initPulse();
-        initLockscreenNotifications();
-
-        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
-            addPreferencesFromResource(R.xml.configure_notification_settings_profile);
-            initLockscreenNotificationsForProfile();
-        }
-
+    protected String getCategoryKey() {
+        return "";
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        mSettingsObserver.register(true);
+    protected String getLogTag() {
+        return TAG;
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
-        mSettingsObserver.register(false);
+    protected int getPreferenceScreenResId() {
+        return R.xml.configure_notification_settings;
     }
 
-    // === Pulse notification light ===
-
-    private void initPulse() {
-        mNotificationPulse =
-                (TwoStatePreference) getPreferenceScreen().findPreference(KEY_NOTIFICATION_PULSE);
-        if (mNotificationPulse == null) {
-            Log.i(TAG, "Preference not found: " + KEY_NOTIFICATION_PULSE);
-            return;
-        }
-        if (!getResources()
-                .getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed)) {
-            getPreferenceScreen().removePreference(mNotificationPulse);
-        } else {
-            updatePulse();
-            mNotificationPulse.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    final boolean val = (Boolean)newValue;
-                    return Settings.System.putInt(getContentResolver(),
-                            Settings.System.NOTIFICATION_LIGHT_PULSE,
-                            val ? 1 : 0);
-                }
-            });
-        }
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        final PulseNotificationPreferenceController pulseController =
+                new PulseNotificationPreferenceController(context);
+        mLockScreenNotificationController = new LockScreenNotificationPreferenceController(context);
+        getLifecycle().addObserver(pulseController);
+        getLifecycle().addObserver(mLockScreenNotificationController);
+        controllers.add(new SwipeToNotificationPreferenceController(context));
+        controllers.add(pulseController);
+        controllers.add(mLockScreenNotificationController);
+        return controllers;
     }
 
-    private void updatePulse() {
-        if (mNotificationPulse == null) {
-            return;
-        }
-        try {
-            mNotificationPulse.setChecked(Settings.System.getInt(getContentResolver(),
-                    Settings.System.NOTIFICATION_LIGHT_PULSE) == 1);
-        } catch (Settings.SettingNotFoundException snfe) {
-            Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
-        }
-    }
-
-    private void initLockscreenNotifications() {
-        mLockscreen = (RestrictedDropDownPreference) getPreferenceScreen().findPreference(
-                KEY_LOCK_SCREEN_NOTIFICATIONS);
-        if (mLockscreen == null) {
-            Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_NOTIFICATIONS);
-            return;
-        }
-
-        ArrayList<CharSequence> entries = new ArrayList<>();
-        ArrayList<CharSequence> values = new ArrayList<>();
-        entries.add(getString(R.string.lock_screen_notifications_summary_disable));
-        values.add(Integer.toString(R.string.lock_screen_notifications_summary_disable));
-
-        String summaryShowEntry = getString(R.string.lock_screen_notifications_summary_show);
-        String summaryShowEntryValue = Integer.toString(
-                R.string.lock_screen_notifications_summary_show);
-        entries.add(summaryShowEntry);
-        values.add(summaryShowEntryValue);
-        setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
-                KEYGUARD_DISABLE_SECURE_NOTIFICATIONS | KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
-
-        if (mSecure) {
-            String summaryHideEntry = getString(R.string.lock_screen_notifications_summary_hide);
-            String summaryHideEntryValue = Integer.toString(
-                    R.string.lock_screen_notifications_summary_hide);
-            entries.add(summaryHideEntry);
-            values.add(summaryHideEntryValue);
-            setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
-                    KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
-        }
-
-        mLockscreen.setEntries(entries.toArray(new CharSequence[entries.size()]));
-        mLockscreen.setEntryValues(values.toArray(new CharSequence[values.size()]));
-        updateLockscreenNotifications();
-        if (mLockscreen.getEntries().length > 1) {
-            mLockscreen.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    final int val = Integer.parseInt((String) newValue);
-                    if (val == mLockscreenSelectedValue) {
-                        return false;
-                    }
-                    final boolean enabled =
-                            val != R.string.lock_screen_notifications_summary_disable;
-                    final boolean show = val == R.string.lock_screen_notifications_summary_show;
-                    Settings.Secure.putInt(getContentResolver(),
-                            Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0);
-                    Settings.Secure.putInt(getContentResolver(),
-                            Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, enabled ? 1 : 0);
-                    mLockscreenSelectedValue = val;
-                    return true;
-                }
-            });
-        } else {
-            // There is one or less option for the user, disable the drop down.
-            mLockscreen.setEnabled(false);
-        }
-    }
-
-    // === Lockscreen (public / private) notifications ===
-    private void initLockscreenNotificationsForProfile() {
-        mLockscreenProfile = (RestrictedDropDownPreference) getPreferenceScreen()
-                .findPreference(KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
-        if (mLockscreenProfile == null) {
-            Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
-            return;
-        }
-        ArrayList<CharSequence> entries = new ArrayList<>();
-        ArrayList<CharSequence> values = new ArrayList<>();
-        entries.add(getString(R.string.lock_screen_notifications_summary_disable_profile));
-        values.add(Integer.toString(R.string.lock_screen_notifications_summary_disable_profile));
-
-        String summaryShowEntry = getString(
-                R.string.lock_screen_notifications_summary_show_profile);
-        String summaryShowEntryValue = Integer.toString(
-                R.string.lock_screen_notifications_summary_show_profile);
-        entries.add(summaryShowEntry);
-        values.add(summaryShowEntryValue);
-        setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
-                KEYGUARD_DISABLE_SECURE_NOTIFICATIONS | KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
-
-        if (mSecureProfile) {
-            String summaryHideEntry = getString(
-                    R.string.lock_screen_notifications_summary_hide_profile);
-            String summaryHideEntryValue = Integer.toString(
-                    R.string.lock_screen_notifications_summary_hide_profile);
-            entries.add(summaryHideEntry);
-            values.add(summaryHideEntryValue);
-            setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
-                    KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
-        }
-
-        mLockscreenProfile.setOnPreClickListener(
-                (Preference p) -> Utils.startQuietModeDialogIfNecessary(mContext,
-                        UserManager.get(mContext),
-                        mProfileChallengeUserId)
-        );
-
-        mLockscreenProfile.setEntries(entries.toArray(new CharSequence[entries.size()]));
-        mLockscreenProfile.setEntryValues(values.toArray(new CharSequence[values.size()]));
-        updateLockscreenNotificationsForProfile();
-        if (mLockscreenProfile.getEntries().length > 1) {
-            mLockscreenProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    final int val = Integer.parseInt((String) newValue);
-                    if (val == mLockscreenSelectedValueProfile) {
-                        return false;
-                    }
-                    final boolean enabled =
-                            val != R.string.lock_screen_notifications_summary_disable_profile;
-                    final boolean show =
-                            val == R.string.lock_screen_notifications_summary_show_profile;
-                    Settings.Secure.putIntForUser(getContentResolver(),
-                            Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
-                            show ? 1 : 0, mProfileChallengeUserId);
-                    Settings.Secure.putIntForUser(getContentResolver(),
-                            Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
-                            enabled ? 1 : 0, mProfileChallengeUserId);
-                    mLockscreenSelectedValueProfile = val;
-                    return true;
-                }
-            });
-        } else {
-            // There is one or less option for the user, disable the drop down.
-            mLockscreenProfile.setEnabled(false);
-        }
-    }
-
-    private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
-            CharSequence entryValue, int keyguardNotificationFeatures) {
-        EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
-                mContext, keyguardNotificationFeatures, UserHandle.myUserId());
-        if (admin != null && mLockscreen != null) {
-            RestrictedDropDownPreference.RestrictedItem item =
-                    new RestrictedDropDownPreference.RestrictedItem(entry, entryValue, admin);
-            mLockscreen.addRestrictedItem(item);
-        }
-        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
-            EnforcedAdmin profileAdmin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
-                    mContext, keyguardNotificationFeatures, mProfileChallengeUserId);
-            if (profileAdmin != null && mLockscreenProfile != null) {
-                RestrictedDropDownPreference.RestrictedItem item =
-                        new RestrictedDropDownPreference.RestrictedItem(
-                                entry, entryValue, profileAdmin);
-                mLockscreenProfile.addRestrictedItem(item);
-            }
-        }
-    }
-
-    private void updateLockscreenNotifications() {
-        if (mLockscreen == null) {
-            return;
-        }
-        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
-        final boolean allowPrivate = !mSecure
-                || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
-        mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
-                allowPrivate ? R.string.lock_screen_notifications_summary_show :
-                R.string.lock_screen_notifications_summary_hide;
-        mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
-    }
-
-    private void updateLockscreenNotificationsForProfile() {
-        if (mProfileChallengeUserId == UserHandle.USER_NULL) {
-            return;
-        }
-        if (mLockscreenProfile == null) {
-            return;
-        }
-        final boolean enabled = getLockscreenNotificationsEnabled(mProfileChallengeUserId);
-        final boolean allowPrivate = !mSecureProfile
-                || getLockscreenAllowPrivateNotifications(mProfileChallengeUserId);
-        mLockscreenSelectedValueProfile = !enabled
-                ? R.string.lock_screen_notifications_summary_disable_profile
-                        : (allowPrivate ? R.string.lock_screen_notifications_summary_show_profile
-                                : R.string.lock_screen_notifications_summary_hide_profile);
-        mLockscreenProfile.setValue(Integer.toString(mLockscreenSelectedValueProfile));
-    }
-
-    private boolean getLockscreenNotificationsEnabled(int userId) {
-        return Settings.Secure.getIntForUser(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, userId) != 0;
-    }
-
-    private boolean getLockscreenAllowPrivateNotifications(int userId) {
-        return Settings.Secure.getIntForUser(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, userId) != 0;
-    }
-
-
-    // === Callbacks ===
-
-    private final class SettingsObserver extends ContentObserver {
-        private final Uri NOTIFICATION_LIGHT_PULSE_URI =
-                Settings.System.getUriFor(Settings.System.NOTIFICATION_LIGHT_PULSE);
-        private final Uri LOCK_SCREEN_PRIVATE_URI =
-                Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
-        private final Uri LOCK_SCREEN_SHOW_URI =
-                Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS);
-
-        public SettingsObserver() {
-            super(new Handler());
-        }
-
-        public void register(boolean register) {
-            final ContentResolver cr = getContentResolver();
-            if (register) {
-                cr.registerContentObserver(NOTIFICATION_LIGHT_PULSE_URI, false, this);
-                cr.registerContentObserver(LOCK_SCREEN_PRIVATE_URI, false, this);
-                cr.registerContentObserver(LOCK_SCREEN_SHOW_URI, false, this);
-            } else {
-                cr.unregisterContentObserver(this);
-            }
-        }
-
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            super.onChange(selfChange, uri);
-            if (NOTIFICATION_LIGHT_PULSE_URI.equals(uri)) {
-                updatePulse();
-            }
-            if (LOCK_SCREEN_PRIVATE_URI.equals(uri) || LOCK_SCREEN_SHOW_URI.equals(uri)) {
-                updateLockscreenNotifications();
-                if (mProfileChallengeUserId != UserHandle.USER_NULL) {
-                    updateLockscreenNotificationsForProfile();
-                }
-            }
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        super.onCreatePreferences(savedInstanceState, rootKey);
+        final Context context = getContext();
+        if (!FeatureFactory.getFactory(context).getDashboardFeatureProvider(context).isEnabled()) {
+            final String prefKey = getPreferenceController(
+                    SwipeToNotificationPreferenceController.class)
+                    .getPreferenceKey();
+            removePreference(prefKey);
         }
     }
 }
diff --git a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
new file mode 100644
index 0000000..15f8c9f
--- /dev/null
+++ b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2016 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.notification;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnPause;
+import com.android.settings.core.lifecycle.events.OnResume;
+import com.android.settingslib.RestrictedLockUtils;
+
+import java.util.ArrayList;
+
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
+
+public class LockScreenNotificationPreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener, LifecycleObserver, OnResume, OnPause {
+
+    private static final String TAG = "LockScreenNotifPref";
+    private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "lock_screen_notifications";
+    private static final String KEY_LOCK_SCREEN_PROFILE_HEADER =
+            "lock_screen_notifications_profile_header";
+    private static final String KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS =
+            "lock_screen_notifications_profile";
+
+    private RestrictedDropDownPreference mLockscreen;
+    private RestrictedDropDownPreference mLockscreenProfile;
+
+    private final int mProfileChallengeUserId;
+    private final boolean mSecure;
+    private final boolean mSecureProfile;
+
+    private SettingObserver mSettingObserver;
+    private int mLockscreenSelectedValue;
+    private int mLockscreenSelectedValueProfile;
+
+    public LockScreenNotificationPreferenceController(Context context) {
+        super(context);
+        mProfileChallengeUserId = Utils.getManagedProfileId(
+                UserManager.get(context), UserHandle.myUserId());
+        final LockPatternUtils utils = new LockPatternUtils(context);
+        final boolean isUnified =
+                !utils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId);
+        mSecure = utils.isSecure(UserHandle.myUserId());
+        mSecureProfile = (mProfileChallengeUserId != UserHandle.USER_NULL)
+                && (utils.isSecure(mProfileChallengeUserId) || (isUnified && mSecure));
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mLockscreen =
+                (RestrictedDropDownPreference) screen.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS);
+        if (mLockscreen == null) {
+            Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_NOTIFICATIONS);
+            return;
+        }
+        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+            mLockscreenProfile = (RestrictedDropDownPreference) screen.findPreference(
+                    KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+        } else {
+            removePreference(screen, KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+            removePreference(screen, KEY_LOCK_SCREEN_PROFILE_HEADER);
+        }
+        mSettingObserver = new SettingObserver();
+        initLockScreenNotificationPrefDisplay();
+        initLockscreenNotificationPrefForProfile();
+    }
+
+    private void initLockScreenNotificationPrefDisplay() {
+        ArrayList<CharSequence> entries = new ArrayList<>();
+        ArrayList<CharSequence> values = new ArrayList<>();
+        entries.add(mContext.getString(R.string.lock_screen_notifications_summary_disable));
+        values.add(Integer.toString(R.string.lock_screen_notifications_summary_disable));
+
+        String summaryShowEntry =
+                mContext.getString(R.string.lock_screen_notifications_summary_show);
+        String summaryShowEntryValue =
+                Integer.toString(R.string.lock_screen_notifications_summary_show);
+        entries.add(summaryShowEntry);
+        values.add(summaryShowEntryValue);
+        setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
+                KEYGUARD_DISABLE_SECURE_NOTIFICATIONS | KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+
+        if (mSecure) {
+            String summaryHideEntry =
+                    mContext.getString(R.string.lock_screen_notifications_summary_hide);
+            String summaryHideEntryValue =
+                    Integer.toString(R.string.lock_screen_notifications_summary_hide);
+            entries.add(summaryHideEntry);
+            values.add(summaryHideEntryValue);
+            setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
+                    KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+        }
+
+        mLockscreen.setEntries(entries.toArray(new CharSequence[entries.size()]));
+        mLockscreen.setEntryValues(values.toArray(new CharSequence[values.size()]));
+        updateLockscreenNotifications();
+
+        if (mLockscreen.getEntries().length > 1) {
+            mLockscreen.setOnPreferenceChangeListener(this);
+        } else {
+            // There is one or less option for the user, disable the drop down.
+            mLockscreen.setEnabled(false);
+        }
+    }
+
+    private void initLockscreenNotificationPrefForProfile() {
+        if (mLockscreenProfile == null) {
+            Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+            return;
+        }
+        ArrayList<CharSequence> entries = new ArrayList<>();
+        ArrayList<CharSequence> values = new ArrayList<>();
+        entries.add(mContext.getString(R.string.lock_screen_notifications_summary_disable_profile));
+        values.add(Integer.toString(R.string.lock_screen_notifications_summary_disable_profile));
+
+        String summaryShowEntry = mContext.getString(
+                R.string.lock_screen_notifications_summary_show_profile);
+        String summaryShowEntryValue = Integer.toString(
+                R.string.lock_screen_notifications_summary_show_profile);
+        entries.add(summaryShowEntry);
+        values.add(summaryShowEntryValue);
+        setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
+                KEYGUARD_DISABLE_SECURE_NOTIFICATIONS | KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+
+        if (mSecureProfile) {
+            String summaryHideEntry = mContext.getString(
+                    R.string.lock_screen_notifications_summary_hide_profile);
+            String summaryHideEntryValue = Integer.toString(
+                    R.string.lock_screen_notifications_summary_hide_profile);
+            entries.add(summaryHideEntry);
+            values.add(summaryHideEntryValue);
+            setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
+                    KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+        }
+        mLockscreenProfile.setOnPreClickListener(
+                (Preference p) -> Utils.startQuietModeDialogIfNecessary(mContext,
+                        UserManager.get(mContext), mProfileChallengeUserId)
+        );
+
+        mLockscreenProfile.setEntries(entries.toArray(new CharSequence[entries.size()]));
+        mLockscreenProfile.setEntryValues(values.toArray(new CharSequence[values.size()]));
+        updateLockscreenNotificationsForProfile();
+        if (mLockscreenProfile.getEntries().length > 1) {
+            mLockscreenProfile.setOnPreferenceChangeListener(this);
+        } else {
+            // There is one or less option for the user, disable the drop down.
+            mLockscreenProfile.setEnabled(false);
+        }
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return null;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return false;
+    }
+
+    @Override
+    public void onResume() {
+        if (mSettingObserver != null) {
+            mSettingObserver.register(mContext.getContentResolver(), true /* register */);
+        }
+    }
+
+    @Override
+    public void onPause() {
+        if (mSettingObserver != null) {
+            mSettingObserver.register(mContext.getContentResolver(), false /* register */);
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        switch (preference.getKey()) {
+            case KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS: {
+                final int val = Integer.parseInt((String) newValue);
+                if (val == mLockscreenSelectedValueProfile) {
+                    return false;
+                }
+                final boolean enabled =
+                        val != R.string.lock_screen_notifications_summary_disable_profile;
+                final boolean show =
+                        val == R.string.lock_screen_notifications_summary_show_profile;
+                Settings.Secure.putIntForUser(mContext.getContentResolver(),
+                        Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
+                        show ? 1 : 0, mProfileChallengeUserId);
+                Settings.Secure.putIntForUser(mContext.getContentResolver(),
+                        Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
+                        enabled ? 1 : 0, mProfileChallengeUserId);
+                mLockscreenSelectedValueProfile = val;
+                return true;
+            }
+            case KEY_LOCK_SCREEN_NOTIFICATIONS: {
+                final int val = Integer.parseInt((String) newValue);
+                if (val == mLockscreenSelectedValue) {
+                    return false;
+                }
+                final boolean enabled =
+                        val != R.string.lock_screen_notifications_summary_disable;
+                final boolean show = val == R.string.lock_screen_notifications_summary_show;
+                Settings.Secure.putInt(mContext.getContentResolver(),
+                        Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, show ? 1 : 0);
+                Settings.Secure.putInt(mContext.getContentResolver(),
+                        Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, enabled ? 1 : 0);
+                mLockscreenSelectedValue = val;
+                return true;
+            }
+            default:
+                return false;
+        }
+    }
+
+    private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
+            CharSequence entryValue, int keyguardNotificationFeatures) {
+        RestrictedLockUtils.EnforcedAdmin admin =
+                RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+                        mContext, keyguardNotificationFeatures, UserHandle.myUserId());
+        if (admin != null && mLockscreen != null) {
+            RestrictedDropDownPreference.RestrictedItem item =
+                    new RestrictedDropDownPreference.RestrictedItem(entry, entryValue, admin);
+            mLockscreen.addRestrictedItem(item);
+        }
+        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+            RestrictedLockUtils.EnforcedAdmin profileAdmin =
+                    RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+                            mContext, keyguardNotificationFeatures, mProfileChallengeUserId);
+            if (profileAdmin != null && mLockscreenProfile != null) {
+                RestrictedDropDownPreference.RestrictedItem item =
+                        new RestrictedDropDownPreference.RestrictedItem(
+                                entry, entryValue, profileAdmin);
+                mLockscreenProfile.addRestrictedItem(item);
+            }
+        }
+    }
+
+    private void updateLockscreenNotifications() {
+        if (mLockscreen == null) {
+            return;
+        }
+        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
+        final boolean allowPrivate = !mSecure
+                || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
+        mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
+                allowPrivate ? R.string.lock_screen_notifications_summary_show :
+                        R.string.lock_screen_notifications_summary_hide;
+        mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
+    }
+
+    private void updateLockscreenNotificationsForProfile() {
+        if (mProfileChallengeUserId == UserHandle.USER_NULL) {
+            return;
+        }
+        if (mLockscreenProfile == null) {
+            return;
+        }
+        final boolean enabled = getLockscreenNotificationsEnabled(mProfileChallengeUserId);
+        final boolean allowPrivate = !mSecureProfile
+                || getLockscreenAllowPrivateNotifications(mProfileChallengeUserId);
+        mLockscreenSelectedValueProfile = !enabled
+                ? R.string.lock_screen_notifications_summary_disable_profile
+                : (allowPrivate ? R.string.lock_screen_notifications_summary_show_profile
+                        : R.string.lock_screen_notifications_summary_hide_profile);
+        mLockscreenProfile.setValue(Integer.toString(mLockscreenSelectedValueProfile));
+    }
+
+    private boolean getLockscreenNotificationsEnabled(int userId) {
+        return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, userId) != 0;
+    }
+
+    private boolean getLockscreenAllowPrivateNotifications(int userId) {
+        return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, userId) != 0;
+    }
+
+    class SettingObserver extends ContentObserver {
+
+        private final Uri LOCK_SCREEN_PRIVATE_URI =
+                Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+        private final Uri LOCK_SCREEN_SHOW_URI =
+                Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS);
+
+        public SettingObserver() {
+            super(new Handler());
+        }
+
+        public void register(ContentResolver cr, boolean register) {
+            if (register) {
+                cr.registerContentObserver(LOCK_SCREEN_PRIVATE_URI, false, this);
+                cr.registerContentObserver(LOCK_SCREEN_SHOW_URI, false, this);
+            } else {
+                cr.unregisterContentObserver(this);
+            }
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            if (LOCK_SCREEN_PRIVATE_URI.equals(uri) || LOCK_SCREEN_SHOW_URI.equals(uri)) {
+                updateLockscreenNotifications();
+                if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+                    updateLockscreenNotificationsForProfile();
+                }
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/notification/PulseNotificationPreferenceController.java b/src/com/android/settings/notification/PulseNotificationPreferenceController.java
new file mode 100644
index 0000000..de365f1
--- /dev/null
+++ b/src/com/android/settings/notification/PulseNotificationPreferenceController.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2016 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.notification;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.util.Log;
+
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnPause;
+import com.android.settings.core.lifecycle.events.OnResume;
+
+import static android.provider.Settings.System.NOTIFICATION_LIGHT_PULSE;
+
+public class PulseNotificationPreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener, LifecycleObserver, OnResume, OnPause {
+
+    private static final String TAG = "PulseNotifPrefContr";
+    private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
+    private SettingObserver mSettingObserver;
+
+    public PulseNotificationPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        Preference preference = screen.findPreference(KEY_NOTIFICATION_PULSE);
+        if (preference != null) {
+            mSettingObserver = new SettingObserver(preference);
+        }
+    }
+
+    @Override
+    public void onResume() {
+        if (mSettingObserver != null) {
+            mSettingObserver.register(mContext.getContentResolver(), true /* register */);
+        }
+    }
+
+    @Override
+    public void onPause() {
+        if (mSettingObserver != null) {
+            mSettingObserver.register(mContext.getContentResolver(), false /* register */);
+        }
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_NOTIFICATION_PULSE;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mContext.getResources()
+                .getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        try {
+            final boolean checked = Settings.System.getInt(mContext.getContentResolver(),
+                    NOTIFICATION_LIGHT_PULSE) == 1;
+            ((TwoStatePreference) preference).setChecked(checked);
+        } catch (Settings.SettingNotFoundException snfe) {
+            Log.e(TAG, NOTIFICATION_LIGHT_PULSE + " not found");
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean val = (Boolean) newValue;
+        return Settings.System.putInt(mContext.getContentResolver(),
+                NOTIFICATION_LIGHT_PULSE, val ? 1 : 0);
+    }
+
+    class SettingObserver extends ContentObserver {
+
+        private final Uri NOTIFICATION_LIGHT_PULSE_URI =
+                Settings.System.getUriFor(Settings.System.NOTIFICATION_LIGHT_PULSE);
+
+        private final Preference mPreference;
+
+        public SettingObserver(Preference preference) {
+            super(new Handler());
+            mPreference = preference;
+        }
+
+        public void register(ContentResolver cr, boolean register) {
+            if (register) {
+                cr.registerContentObserver(NOTIFICATION_LIGHT_PULSE_URI, false, this);
+            } else {
+                cr.unregisterContentObserver(this);
+            }
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            if (NOTIFICATION_LIGHT_PULSE_URI.equals(uri)) {
+                updateState(mPreference);
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/widget/RingProgressBar.java b/src/com/android/settings/widget/RingProgressBar.java
new file mode 100644
index 0000000..605e4e9
--- /dev/null
+++ b/src/com/android/settings/widget/RingProgressBar.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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.widget.ProgressBar;
+
+import com.android.settings.R;
+
+/**
+ * A (determinate) progress bar in the form of a ring. The progress bar goes clockwise starting
+ * from the 12 o'clock position. This view maintain equal width and height using a strategy similar
+ * to "centerInside" for ImageView.
+ */
+public class RingProgressBar extends ProgressBar {
+
+    public RingProgressBar(Context context) {
+        this(context, null);
+    }
+
+    public RingProgressBar(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public RingProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, R.style.RingProgressBarStyle);
+    }
+
+    public RingProgressBar(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        final int measuredHeight = getMeasuredHeight();
+        final int measuredWidth = getMeasuredWidth();
+        final int shortSide = Math.min(measuredHeight, measuredWidth);
+        setMeasuredDimension(shortSide, shortSide);
+    }
+}
diff --git a/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java b/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
new file mode 100644
index 0000000..4b8e6cf
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 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.tests;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import com.android.settings.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static android.support.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE;
+import static org.hamcrest.core.AllOf.allOf;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DashboardAdapterTest {
+    @Before
+    public void SetUp() {
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(Settings
+                .ACTION_SETTINGS));
+    }
+
+    @Test
+    public void testTileConsistency_ToggleSuggestionsAndOpenBluetooth_shouldInBluetooth()
+            throws Exception{
+        final Context context = InstrumentationRegistry.getTargetContext();
+
+        onView(allOf(withText(context.getString(R.string.suggestions_title)),
+                withEffectiveVisibility(VISIBLE))).perform(click());
+        onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
+                withEffectiveVisibility(VISIBLE))).perform(click());
+
+        // It should go to Bluetooth sub page, not other page or crash
+        onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
+                withEffectiveVisibility(VISIBLE))).check(matches(isDisplayed()));
+
+    }
+}
diff --git a/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java b/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java
new file mode 100644
index 0000000..0b1308e
--- /dev/null
+++ b/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016 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.tests;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.os.BatteryManager;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import com.android.settings.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static junit.framework.Assert.assertEquals;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class KeepOnScreenTest {
+    private static int EXPECTED_FLAG = BatteryManager.BATTERY_PLUGGED_AC
+            | BatteryManager.BATTERY_PLUGGED_USB | BatteryManager.BATTERY_PLUGGED_WIRELESS;
+
+    @Test
+    public void testStayAwake_turnOn_StayAwakeWhileWirelessCharging() throws Exception{
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(android.provider.Settings
+                .ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
+
+        final Context targetContext = instrumentation.getTargetContext();
+        final int prevFlag = Settings.Global.getInt(targetContext.getContentResolver(), Settings
+                .Global.STAY_ON_WHILE_PLUGGED_IN);
+
+        // Turn on "Stay Awake" if needed
+        if (prevFlag == 0) {
+            onView(withText(R.string.keep_screen_on)).perform(click());
+        }
+
+        final int currentFlag = Settings.Global.getInt(targetContext.getContentResolver(), Settings
+                .Global.STAY_ON_WHILE_PLUGGED_IN);
+
+        assertEquals(EXPECTED_FLAG, currentFlag);
+
+        // Since this app doesn't have permission(and shouldn't have) to change global setting, we
+        // can only tearDown in this way
+        if (prevFlag != currentFlag) {
+            onView(withText(R.string.keep_screen_on)).perform(click());
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
index 5af8544..ac499eb 100644
--- a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
@@ -18,16 +18,13 @@
 
 import android.app.Activity;
 import android.provider.Settings.System;
-
 import com.android.settings.dashboard.SummaryLoader;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
@@ -36,7 +33,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DisplaySettingsTest {
 
diff --git a/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java b/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java
index da23d5f..86b613c 100644
--- a/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java
@@ -17,13 +17,11 @@
 
 import android.app.Dialog;
 import android.app.Fragment;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static org.junit.Assert.fail;
@@ -31,7 +29,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SettingsDialogFragmentTest {
 
diff --git a/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java
new file mode 100644
index 0000000..1a7647d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2016 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;
+
+import java.util.List;
+import org.junit.runners.model.InitializationError;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.manifest.AndroidManifest;
+import org.robolectric.res.Fs;
+import org.robolectric.res.ResourcePath;
+
+/**
+ * Custom test runner for the testing of BluetoothPairingDialogs. This is needed because the
+ * default behavior for robolectric is just to grab the resource directory in the target package.
+ * We want to override this to add several spanning different projects.
+ */
+public class SettingsRobolectricTestRunner extends RobolectricTestRunner {
+
+    /**
+     * We don't actually want to change this behavior, so we just call super.
+     */
+    public SettingsRobolectricTestRunner(Class<?> testClass) throws InitializationError {
+        super(testClass);
+    }
+
+    /**
+     * We are going to create our own custom manifest so that we can add multiple resource
+     * paths to it. This lets us access resources in both Settings and SettingsLib in our tests.
+     */
+    @Override
+    protected AndroidManifest getAppManifest(Config config) {
+        // Using the manifest file's relative path, we can figure out the application directory.
+        final String appRoot = "packages/apps/Settings";
+        final String manifestPath = appRoot + "/AndroidManifest.xml";
+        final String resDir = appRoot + "/res";
+        final String assetsDir = appRoot + "/assets";
+
+        // By adding any resources from libraries we need to the AndroidManifest, we can access
+        // them from within the parallel universe's resource loader.
+        final AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestPath),
+                Fs.fileFromPath(resDir), Fs.fileFromPath(assetsDir)) {
+            @Override
+            public List<ResourcePath> getIncludedResourcePaths() {
+                List<ResourcePath> paths = super.getIncludedResourcePaths();
+                paths.add(new ResourcePath(
+                        getPackageName(),
+                        Fs.fileFromPath("./packages/apps/Settings/res"),
+                        null));
+                paths.add(new ResourcePath(
+                        getPackageName(),
+                        Fs.fileFromPath("./frameworks/base/packages/SettingsLib/res"),
+                        null));
+                return paths;
+            }
+        };
+
+        // Set the package name to the renamed one
+        manifest.setPackageName("com.android.settings");
+        return manifest;
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/SummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/SummaryPreferenceTest.java
index e55f069..e8440dd 100644
--- a/tests/robotests/src/com/android/settings/SummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/SummaryPreferenceTest.java
@@ -22,18 +22,16 @@
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SummaryPreferenceTest {
 
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
new file mode 100644
index 0000000..dacd303
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -0,0 +1,68 @@
+package com.android.settings;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.wifi.WifiManager;
+import java.net.InetAddress;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UtilsTest {
+
+    private Context mContext;
+    @Mock private WifiManager wifiManager;
+    @Mock private Network network;
+    @Mock private ConnectivityManager connectivityManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getSystemService(WifiManager.class)).thenReturn(wifiManager);
+        when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE))
+            .thenReturn(connectivityManager);
+    }
+
+    @Test
+    public void testGetWifiIpAddresses_succeeds() throws Exception {
+        when(wifiManager.getCurrentNetwork()).thenReturn(network);
+        LinkAddress address = new LinkAddress(InetAddress.getByName("127.0.0.1"), 0);
+        LinkProperties lp = new LinkProperties();
+        lp.addLinkAddress(address);
+        when(connectivityManager.getLinkProperties(network)).thenReturn(lp);
+
+        assertThat(Utils.getWifiIpAddresses(mContext)).isEqualTo("127.0.0.1");
+    }
+
+    @Test
+    public void testGetWifiIpAddresses_nullLinkProperties() {
+        when(wifiManager.getCurrentNetwork()).thenReturn(network);
+        // Explicitly set the return value to null for readability sake.
+        when(connectivityManager.getLinkProperties(network)).thenReturn(null);
+
+        assertThat(Utils.getWifiIpAddresses(mContext)).isNull();
+    }
+
+    @Test
+    public void testGetWifiIpAddresses_nullNetwork() {
+        // Explicitly set the return value to null for readability sake.
+        when(wifiManager.getCurrentNetwork()).thenReturn(null);
+
+        assertThat(Utils.getWifiIpAddresses(mContext)).isNull();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
new file mode 100644
index 0000000..2d266b6
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016 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.accounts;
+
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.drawer.CategoryKey;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UserAndAccountDashboardFragmentTest {
+
+  @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+  private Context mContext;
+
+  private UserAndAccountDashboardFragment mFragment;
+
+  @Before
+  public void setUp() {
+    MockitoAnnotations.initMocks(this);
+    FakeFeatureFactory.setupForTest(mContext);
+    mFragment = new UserAndAccountDashboardFragment();
+  }
+
+  @Test
+  public void testCategory_isConnectedDevice() {
+    assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_ACCOUNT);
+  }
+
+}
diff --git a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java b/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
new file mode 100644
index 0000000..d0c5889
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 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;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AdvancedAppSettingsTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private AdvancedAppSettings mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        FakeFeatureFactory.setupForTest(mContext);
+        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+        mFragment = new AdvancedAppSettings();
+        mFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
+    }
+
+    @Test
+    public void getPreferenceScreenResId_differentIAEnabledState_shouldUseDifferentPrefLayout() {
+        when(mFeatureFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
+        assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+                R.xml.app_default_settings);
+
+        when(mFeatureFactory.dashboardFeatureProvider.isEnabled()).thenReturn(false);
+        assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+                R.xml.advanced_apps);
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
new file mode 100644
index 0000000..035d29e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2016 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.bluetooth;
+
+import android.app.AlertDialog;
+import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.TextView;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.FragmentTestUtil;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BluetoothPairingDialogTest {
+
+    private static final String FILLER = "text that goes in a view";
+    private static final String FAKE_DEVICE_NAME = "Fake Bluetooth Device";
+
+    @Mock
+    private BluetoothPairingController controller;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void dialogUpdatesControllerWithUserInput() {
+        // set the correct dialog type
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // we don't care about these for this test
+        when(controller.getDeviceVariantMessageId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+        when(controller.getDeviceVariantMessageHintId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // build fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // test that controller is updated on text change
+        frag.afterTextChanged(new SpannableStringBuilder(FILLER));
+        verify(controller, times(1)).updateUserInput(any());
+    }
+
+    @Test
+    public void dialogEnablesSubmitButtonOnValidationFromController() {
+        // set the correct dialog type
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // we don't care about these for this test
+        when(controller.getDeviceVariantMessageId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+        when(controller.getDeviceVariantMessageHintId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // force the controller to say that any passkey is valid
+        when(controller.isPasskeyValid(any())).thenReturn(true);
+
+        // build fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // test that the positive button is enabled when passkey is valid
+        frag.afterTextChanged(new SpannableStringBuilder(FILLER));
+        View button = frag.getmDialog().getButton(AlertDialog.BUTTON_POSITIVE);
+        assertThat(button).isNotNull();
+        assertThat(button.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void dialogDoesNotAskForPairCodeOnConsentVariant() {
+        // set the dialog variant to confirmation/consent
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // check that the input field used by the entry dialog fragment does not exist
+        View view = frag.getmDialog().findViewById(R.id.text);
+        assertThat(view).isNull();
+    }
+
+    @Test
+    public void dialogAsksForPairCodeOnUserEntryVariant() {
+        // set the dialog variant to user entry
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // we don't care about these for this test
+        when(controller.getDeviceVariantMessageId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+        when(controller.getDeviceVariantMessageHintId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // check that the pin/passkey input field is visible to the user
+        View view = frag.getmDialog().findViewById(R.id.text);
+        assertThat(view.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void dialogDisplaysPairCodeOnDisplayPasskeyVariant() {
+        // set the dialog variant to display passkey
+        when(controller.getDialogType())
+                .thenReturn(BluetoothPairingController.DISPLAY_PASSKEY_DIALOG);
+
+        // ensure that the controller returns good values to indicate a passkey needs to be shown
+        when(controller.isDisplayPairingKeyVariant()).thenReturn(true);
+        when(controller.hasPairingContent()).thenReturn(true);
+        when(controller.getPairingContent()).thenReturn(FILLER);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // get the relevant views
+        View messagePairing = frag.getmDialog().findViewById(R.id.pairing_code_message);
+        TextView pairingViewContent =
+                (TextView) frag.getmDialog().findViewById(R.id.pairing_subhead);
+        View pairingViewCaption = frag.getmDialog().findViewById(R.id.pairing_caption);
+
+        // check that the relevant views are visible and that the passkey is shown
+        assertThat(messagePairing.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(pairingViewCaption.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(pairingViewContent.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(TextUtils.equals(FILLER, pairingViewContent.getText())).isTrue();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void dialogThrowsExceptionIfNoControllerSet() {
+        // instantiate a fragment
+        BluetoothPairingDialogFragment frag = new BluetoothPairingDialogFragment();
+
+        // this should throw an error
+        FragmentTestUtil.startFragment(frag);
+        fail("Starting the fragment with no controller set should have thrown an exception.");
+    }
+
+    @Test
+    public void dialogCallsHookOnPositiveButtonPress() {
+        // set the dialog variant to confirmation/consent
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
+
+        // we don't care what this does, just that it is called
+        doNothing().when(controller).onDialogPositiveClick(any());
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // click the button and verify that the controller hook was called
+        frag.onClick(frag.getmDialog(), AlertDialog.BUTTON_POSITIVE);
+        verify(controller, times(1)).onDialogPositiveClick(any());
+    }
+
+    @Test
+    public void dialogCallsHookOnNegativeButtonPress() {
+        // set the dialog variant to confirmation/consent
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
+
+        // we don't care what this does, just that it is called
+        doNothing().when(controller).onDialogNegativeClick(any());
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // click the button and verify that the controller hook was called
+        frag.onClick(frag.getmDialog(), AlertDialog.BUTTON_NEGATIVE);
+        verify(controller, times(1)).onDialogNegativeClick(any());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void dialogDoesNotAllowSwappingController() {
+        // instantiate a fragment
+        BluetoothPairingDialogFragment frag = new BluetoothPairingDialogFragment();
+        frag.setPairingController(controller);
+
+        // this should throw an error
+        frag.setPairingController(controller);
+        fail("Setting the controller multiple times should throw an exception.");
+    }
+
+    @Test
+    public void dialogPositiveButtonDisabledWhenUserInputInvalid() {
+        // set the correct dialog type
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // we don't care about these for this test
+        when(controller.getDeviceVariantMessageId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+        when(controller.getDeviceVariantMessageHintId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // force the controller to say that any passkey is valid
+        when(controller.isPasskeyValid(any())).thenReturn(false);
+
+        // build fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // test that the positive button is enabled when passkey is valid
+        frag.afterTextChanged(new SpannableStringBuilder(FILLER));
+        View button = frag.getmDialog().getButton(AlertDialog.BUTTON_POSITIVE);
+        assertThat(button).isNotNull();
+        assertThat(button.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void dialogShowsContactSharingCheckboxWhenBluetoothProfileNotReady() {
+        // set the dialog variant to confirmation/consent
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
+
+        // set a fake device name and pretend the profile has not been set up for it
+        when(controller.getDeviceName()).thenReturn(FAKE_DEVICE_NAME);
+        when(controller.isProfileReady()).thenReturn(false);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // verify that the checkbox is visible and that the device name is correct
+        CheckBox sharingCheckbox = (CheckBox) frag.getmDialog()
+                .findViewById(R.id.phonebook_sharing_message_confirm_pin);
+        assertThat(sharingCheckbox.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(sharingCheckbox.getText().toString().contains(FAKE_DEVICE_NAME)).isTrue();
+    }
+
+    @Test
+    public void dialogHidesContactSharingCheckboxWhenBluetoothProfileIsReady() {
+        // set the dialog variant to confirmation/consent
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
+
+        // set a fake device name and pretend the profile has been set up for it
+        when(controller.getDeviceName()).thenReturn(FAKE_DEVICE_NAME);
+        when(controller.isProfileReady()).thenReturn(true);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // verify that the checkbox is gone
+        CheckBox sharingCheckbox = (CheckBox) frag.getmDialog()
+                .findViewById(R.id.phonebook_sharing_message_confirm_pin);
+        assertThat(sharingCheckbox.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void dialogShowsMessageOnPinEntryView() {
+        // set the correct dialog type
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // Set the message id to something specific to verify later
+        when(controller.getDeviceVariantMessageId()).thenReturn(R.string.cancel);
+        when(controller.getDeviceVariantMessageHintId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // verify message is what we expect it to be and is visible
+        TextView message = (TextView) frag.getmDialog().findViewById(R.id.message_below_pin);
+        assertThat(message.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(TextUtils.equals(frag.getString(R.string.cancel), message.getText())).isTrue();
+    }
+
+    @Test
+    public void dialogShowsMessageHintOnPinEntryView() {
+        // set the correct dialog type
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // Set the message id hint to something specific to verify later
+        when(controller.getDeviceVariantMessageHintId()).thenReturn(R.string.cancel);
+        when(controller.getDeviceVariantMessageId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // verify message is what we expect it to be and is visible
+        TextView hint = (TextView) frag.getmDialog().findViewById(R.id.pin_values_hint);
+        assertThat(hint.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(TextUtils.equals(frag.getString(R.string.cancel), hint.getText())).isTrue();
+    }
+
+    @Test
+    public void dialogHidesMessageAndHintWhenNotProvidedOnPinEntryView() {
+        // set the correct dialog type
+        when(controller.getDialogType()).thenReturn(BluetoothPairingController.USER_ENTRY_DIALOG);
+
+        // Set the id's to what is returned when it is not provided
+        when(controller.getDeviceVariantMessageHintId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+        when(controller.getDeviceVariantMessageId())
+                .thenReturn(BluetoothPairingController.INVALID_DIALOG_TYPE);
+
+        // build the fragment
+        BluetoothPairingDialogFragment frag = makeFragment();
+
+        // verify message is what we expect it to be and is visible
+        TextView hint = (TextView) frag.getmDialog().findViewById(R.id.pin_values_hint);
+        assertThat(hint.getVisibility()).isEqualTo(View.GONE);
+        TextView message = (TextView) frag.getmDialog().findViewById(R.id.message_below_pin);
+        assertThat(message.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    private BluetoothPairingDialogFragment makeFragment() {
+        BluetoothPairingDialogFragment frag = new BluetoothPairingDialogFragment();
+        frag.setPairingController(controller);
+        FragmentTestUtil.startFragment(frag);
+        assertThat(frag.getmDialog()).isNotNull();
+        return frag;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/conditional/ConditionAdapterUtilsTest.java b/tests/robotests/src/com/android/settings/conditional/ConditionAdapterUtilsTest.java
new file mode 100644
index 0000000..dde291d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/conditional/ConditionAdapterUtilsTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 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.conditional;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.dashboard.DashboardAdapter;
+import com.android.settings.dashboard.conditional.Condition;
+import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import com.android.settings.R;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ConditionAdapterUtilsTest{
+    @Mock
+    private Condition mCondition;
+    private DashboardAdapter.DashboardItemHolder mViewHolder;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        final CharSequence[] actions = new CharSequence[2];
+        when(mCondition.getActions()).thenReturn(actions);
+
+        final View view = LayoutInflater.from(mContext).inflate(R.layout.condition_card, new
+                LinearLayout(mContext), true);
+        mViewHolder = new DashboardAdapter.DashboardItemHolder(view);
+    }
+
+    @Test
+    public void testBindView_isExpanded_returnVisible() {
+        ConditionAdapterUtils.bindViews(mCondition, mViewHolder, true, null, null);
+        assertThat(mViewHolder.itemView.findViewById(R.id.detail_group).getVisibility())
+                .isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testBindView_isNotExpanded_returnGone() {
+        ConditionAdapterUtils.bindViews(mCondition, mViewHolder, false, null, null);
+        assertThat(mViewHolder.itemView.findViewById(R.id.detail_group).getVisibility())
+                .isEqualTo(View.GONE);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
index e6570e1..d53a27b 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
@@ -16,23 +16,21 @@
 package com.android.settings.connecteddevice;
 
 import android.content.Context;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.drawer.CategoryKey;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ConnectedDeviceDashboardFragmentTest {
 
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceControllerTest.java b/tests/robotests/src/com/android/settings/core/PreferenceControllerTest.java
index ef03d5b..aaab183 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceControllerTest.java
@@ -18,15 +18,13 @@
 import android.content.Context;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static org.mockito.Matchers.any;
@@ -34,7 +32,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class PreferenceControllerTest {
 
@@ -102,12 +100,12 @@
         }
 
         @Override
-        protected boolean isAvailable() {
+        public boolean isAvailable() {
             return isAvailable;
         }
 
         @Override
-        protected String getPreferenceKey() {
+        public String getPreferenceKey() {
             return KEY_PREF;
         }
     }
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
index 14b3bb4..0abac1d 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
@@ -16,18 +16,16 @@
 package com.android.settings.core.instrumentation;
 
 import android.os.Bundle;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class InstrumentedDialogFragmentTest {
 
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java
index 22be988..41a2a71 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java
@@ -16,22 +16,20 @@
 package com.android.settings.core.instrumentation;
 
 import android.content.Context;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.overlay.FeatureFactory;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class MetricsFeatureProviderTest {
 
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
index a3e0e45..dad6fa9 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
@@ -17,16 +17,14 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.overlay.FeatureFactory;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
@@ -36,7 +34,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SharedPreferenceLoggerTest {
 
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
index 3fa8c94..56fa786 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
@@ -16,15 +16,13 @@
 package com.android.settings.core.instrumentation;
 
 import android.content.Context;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.android.settings.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
@@ -36,7 +34,7 @@
 import static org.mockito.Mockito.verify;
 
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class VisibilityLoggerMixinTest {
 
diff --git a/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java b/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java
index bc7b129..6aae543 100644
--- a/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java
+++ b/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java
@@ -16,7 +16,7 @@
 package com.android.settings.core.lifecycle;
 
 import android.content.Context;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.core.lifecycle.events.OnAttach;
 import com.android.settings.core.lifecycle.events.OnDestroy;
@@ -24,18 +24,16 @@
 import com.android.settings.core.lifecycle.events.OnResume;
 import com.android.settings.core.lifecycle.events.OnStart;
 import com.android.settings.core.lifecycle.events.OnStop;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ActivityController;
 import org.robolectric.util.FragmentController;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class LifecycleTest {
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
new file mode 100644
index 0000000..52c2103
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.support.annotation.NonNull;
+import android.support.v7.util.DiffUtil;
+import android.support.v7.util.ListUpdateCallback;
+import com.android.settings.TestConfig;
+import com.android.settings.dashboard.conditional.AirplaneModeCondition;
+import com.android.settings.dashboard.conditional.Condition;
+import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.Tile;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DashboardDataTest {
+    private static final String TEST_SUGGESTION_TITLE = "Use fingerprint";
+    private static final String TEST_CATEGORY_TILE_TITLE = "Display";
+
+    private DashboardData mDashboardDataWithOneConditions;
+    private DashboardData mDashboardDataWithTwoConditions;
+    private DashboardData mDashboardDataWithNoItems;
+    @Mock
+    private Tile mTestCategoryTile;
+    @Mock
+    private Tile mTestSuggestion;
+    @Mock
+    private DashboardCategory mDashboardCategory;
+    @Mock
+    private Condition mTestCondition;
+    @Mock
+    private Condition mSecondCondition; // condition used to test insert in DiffUtil
+
+    @Before
+    public void SetUp() {
+        MockitoAnnotations.initMocks(this);
+
+        // Build suggestions
+        final List<Tile> suggestions = new ArrayList<>();
+        mTestSuggestion.title = TEST_SUGGESTION_TITLE;
+        suggestions.add(mTestSuggestion);
+
+        // Build oneItemConditions
+        final List<Condition> oneItemConditions = new ArrayList<>();
+        when(mTestCondition.shouldShow()).thenReturn(true);
+        oneItemConditions.add(mTestCondition);
+
+        // Build twoItemConditions
+        final List<Condition> twoItemsConditions = new ArrayList<>();
+        when(mSecondCondition.shouldShow()).thenReturn(true);
+        twoItemsConditions.add(mTestCondition);
+        twoItemsConditions.add(mSecondCondition);
+
+        // Build categories
+        final List<DashboardCategory> categories = new ArrayList<>();
+        mTestCategoryTile.title = TEST_CATEGORY_TILE_TITLE;
+        mDashboardCategory.title = "test";
+        mDashboardCategory.tiles = new ArrayList<>();
+        mDashboardCategory.tiles.add(mTestCategoryTile);
+        categories.add(mDashboardCategory);
+
+        // Build DashboardData 
+        mDashboardDataWithOneConditions = new DashboardData.Builder()
+                .setConditions(oneItemConditions)
+                .setCategories(categories)
+                .setSuggestions(suggestions)
+                .build();
+
+        mDashboardDataWithTwoConditions = new DashboardData.Builder()
+                .setConditions(twoItemsConditions)
+                .setCategories(categories)
+                .setSuggestions(suggestions)
+                .build();
+
+        mDashboardDataWithNoItems = new DashboardData.Builder()
+                .setConditions(null)
+                .setCategories(null)
+                .setSuggestions(null)
+                .build();
+    }
+
+    @Test
+    public void testBuildItemsData_containsAllData() {
+        final DashboardData.SuggestionHeaderData data =
+                new DashboardData.SuggestionHeaderData(false, 1, 0);
+        final Object[] expectedObjects = {mTestCondition, null, data, mTestSuggestion,
+                mDashboardCategory, mTestCategoryTile};
+        final int expectedSize = expectedObjects.length;
+
+        assertThat(mDashboardDataWithOneConditions.getItemList().size())
+                .isEqualTo(expectedSize);
+        for (int i = 0; i < expectedSize; i++) {
+            if (mDashboardDataWithOneConditions.getItemEntityByPosition(i)
+                    instanceof DashboardData.SuggestionHeaderData) {
+                // SuggestionHeaderData is created inside when build, we can only use isEqualTo
+                assertThat(mDashboardDataWithOneConditions.getItemEntityByPosition(i))
+                        .isEqualTo(expectedObjects[i]);
+            } else {
+                assertThat(mDashboardDataWithOneConditions.getItemEntityByPosition(i))
+                        .isSameAs(expectedObjects[i]);
+            }
+        }
+    }
+
+    @Test
+    public void testGetPositionByEntity_selfInstance_returnPositionFound() {
+        final int position = mDashboardDataWithOneConditions
+                .getPositionByEntity(mTestCondition);
+        assertThat(position).isNotEqualTo(DashboardData.POSITION_NOT_FOUND);
+    }
+
+    @Test
+    public void testGetPositionByEntity_notExisted_returnNotFound() {
+        final Condition condition = mock(AirplaneModeCondition.class);
+        final int position = mDashboardDataWithOneConditions.getPositionByEntity(condition);
+        assertThat(position).isEqualTo(DashboardData.POSITION_NOT_FOUND);
+    }
+
+    @Test
+    public void testGetPositionByTile_selfInstance_returnPositionFound() {
+        final int position = mDashboardDataWithOneConditions
+                .getPositionByTile(mTestCategoryTile);
+        assertThat(position).isNotEqualTo(DashboardData.POSITION_NOT_FOUND);
+    }
+
+    @Test
+    public void testGetPositionByTile_equalTitle_returnPositionFound() {
+        final Tile tile = mock(Tile.class);
+        tile.title = TEST_CATEGORY_TILE_TITLE;
+        final int position = mDashboardDataWithOneConditions.getPositionByTile(tile);
+        assertThat(position).isNotEqualTo(DashboardData.POSITION_NOT_FOUND);
+    }
+
+    @Test
+    public void testGetPositionByTile_notExisted_returnNotFound() {
+        final Tile tile = mock(Tile.class);
+        tile.title = "";
+        final int position = mDashboardDataWithOneConditions.getPositionByTile(tile);
+        assertThat(position).isEqualTo(DashboardData.POSITION_NOT_FOUND);
+    }
+
+    @Test
+    public void testDiffUtil_DataEqual_noResultData() {
+        List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
+        testDiffUtil(mDashboardDataWithOneConditions, 
+                mDashboardDataWithOneConditions, testResultData);
+    }
+
+    @Test
+    public void testDiffUtil_InsertOneCondition_ResultDataOneInserted() {
+        //Build testResultData
+        final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
+        testResultData.add(new ListUpdateResult.ResultData(
+                ListUpdateResult.ResultData.TYPE_OPERATION_INSERT, 1, 1));
+
+        testDiffUtil(mDashboardDataWithOneConditions,
+                mDashboardDataWithTwoConditions, testResultData);
+    }
+
+    @Test
+    public void testDiffUtil_DeleteAllData_ResultDataOneDeleted() {
+        //Build testResultData
+        final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
+        testResultData.add(new ListUpdateResult.ResultData(
+                ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 6));
+
+        testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
+    }
+
+    /**
+     * Test when using the
+     * {@link com.android.settings.dashboard.DashboardData.ItemsDataDiffCallback}
+     * to transfer List from {@paramref baseDashboardData} to {@paramref diffDashboardData}, whether
+     * the transform data result is equals to {@paramref testResultData}
+     * <p>
+     * The steps are described below:
+     * 1. Calculate a {@link android.support.v7.util.DiffUtil.DiffResult} from
+     * {@paramref baseDashboardData} to {@paramref diffDashboardData}
+     * <p>
+     * 2. Dispatch the {@link android.support.v7.util.DiffUtil.DiffResult} calculated from step 1
+     * into {@link ListUpdateResult}
+     * <p>
+     * 3. Get result data(a.k.a. baseResultData) from {@link ListUpdateResult} and compare it to
+     * {@paramref testResultData}
+     * <p>
+     * Because baseResultData and {@paramref testResultData} don't have sequence. When do the
+     * comparison, we will sort them first and then compare the inside data from them one by one.
+     *
+     * @param baseDashboardData
+     * @param diffDashboardData
+     * @param testResultData
+     */
+    private void testDiffUtil(DashboardData baseDashboardData, DashboardData diffDashboardData,
+            List<ListUpdateResult.ResultData> testResultData) {
+        final DiffUtil.DiffResult diffUtilResult = DiffUtil.calculateDiff(
+                new DashboardData.ItemsDataDiffCallback(
+                        baseDashboardData.getItemList(), diffDashboardData.getItemList()));
+
+        // Dispatch to listUpdateResult, then listUpdateResult will have result data
+        final ListUpdateResult listUpdateResult = new ListUpdateResult();
+        diffUtilResult.dispatchUpdatesTo(listUpdateResult);
+
+        final List<ListUpdateResult.ResultData> baseResultData = listUpdateResult.getResultData();
+        assertThat(testResultData.size()).isEqualTo(baseResultData.size());
+
+        // Sort them so we can compare them one by one using a for loop
+        Collections.sort(baseResultData);
+        Collections.sort(testResultData);
+        final int size = baseResultData.size();
+        for (int i = 0; i < size; i++) {
+            // Refer to equals method in ResultData
+            assertThat(baseResultData.get(i)).isEqualTo(testResultData.get(i));
+        }
+    }
+
+    /**
+     * This class contains the result about how the changes made to convert one
+     * list to another list. It implements ListUpdateCallback to record the result data.
+     */
+    private static class ListUpdateResult implements ListUpdateCallback {
+        final private List<ResultData> mResultData;
+
+        public ListUpdateResult() {
+            mResultData = new ArrayList<>();
+        }
+
+        public List<ResultData> getResultData() {
+            return mResultData;
+        }
+
+        @Override
+        public void onInserted(int position, int count) {
+            mResultData.add(new ResultData(ResultData.TYPE_OPERATION_INSERT, position, count));
+        }
+
+        @Override
+        public void onRemoved(int position, int count) {
+            mResultData.add(new ResultData(ResultData.TYPE_OPERATION_REMOVE, position, count));
+        }
+
+        @Override
+        public void onMoved(int fromPosition, int toPosition) {
+            mResultData.add(
+                    new ResultData(ResultData.TYPE_OPERATION_MOVE, fromPosition, toPosition));
+        }
+
+        @Override
+        public void onChanged(int position, int count, Object payload) {
+            mResultData.add(new ResultData(ResultData.TYPE_OPERATION_CHANGE, position, count));
+        }
+
+        /**
+         * This class contains general type and field to record the operation data generated
+         * in {@link ListUpdateCallback}. Please refer to {@link ListUpdateCallback} for more info.
+         * <p>
+         * The following are examples about the data stored in this class:
+         * <p>
+         * "The data starts from position(arg1) with count number(arg2) is changed(operation)"
+         * or "The data is moved(operation) from position1(arg1) to position2(arg2)"
+         */
+        private static class ResultData implements Comparable<ResultData> {
+            public static final int TYPE_OPERATION_INSERT = 0;
+            public static final int TYPE_OPERATION_REMOVE = 1;
+            public static final int TYPE_OPERATION_MOVE = 2;
+            public static final int TYPE_OPERATION_CHANGE = 3;
+
+            public final int operation;
+            public final int arg1;
+            public final int arg2;
+
+            public ResultData(int operation, int arg1, int arg2) {
+                this.operation = operation;
+                this.arg1 = arg1;
+                this.arg2 = arg2;
+            }
+
+            @Override
+            public boolean equals(Object obj) {
+                if (this == obj) {
+                    return true;
+                }
+
+                if (!(obj instanceof ResultData)) {
+                    return false;
+                }
+
+                ResultData targetData = (ResultData) obj;
+
+                return operation == targetData.operation && arg1 == targetData.arg1
+                        && arg2 == targetData.arg2;
+            }
+
+            @Override
+            public int compareTo(@NonNull ResultData resultData) {
+                if (this.operation != resultData.operation) {
+                    return operation - resultData.operation;
+                }
+
+                if (arg1 != resultData.arg1) {
+                    return arg1 - resultData.arg1;
+                }
+
+                return arg2 - resultData.arg2;
+            }
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDividerDecorationTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDividerDecorationTest.java
index adfa608..e829eb2 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardDividerDecorationTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDividerDecorationTest.java
@@ -24,18 +24,16 @@
 import android.support.v7.preference.PreferenceGroupAdapter;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.testutils.FakeFeatureFactory;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static org.mockito.Matchers.any;
@@ -43,7 +41,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DashboardDividerDecorationTest {
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
new file mode 100644
index 0000000..66f2289
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settingslib.drawer.Tile;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DashboardFeatureProviderImplTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Activity mActivity;
+
+    private DashboardFeatureProviderImpl mImpl;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mImpl = new DashboardFeatureProviderImpl(mActivity);
+    }
+
+    @Test
+    public void bindPreference_shouldBindAllData() {
+        final Preference preference = new Preference(
+                ShadowApplication.getInstance().getApplicationContext());
+        final Tile tile = new Tile();
+        tile.title = "title";
+        tile.summary = "summary";
+        tile.icon = Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565));
+        tile.metaData = new Bundle();
+        tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI");
+        tile.priority = 10;
+        mImpl.bindPreferenceToTile(mActivity, preference, tile, "123");
+
+        assertThat(preference.getTitle()).isEqualTo(tile.title);
+        assertThat(preference.getSummary()).isEqualTo(tile.summary);
+        assertThat(preference.getIcon()).isNotNull();
+        assertThat(preference.getFragment())
+                .isEqualTo(tile.metaData.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS));
+        assertThat(preference.getOrder()).isEqualTo(-tile.priority);
+    }
+
+    @Test
+    public void bindPreference_noFragmentMetadata_shouldBindIntent() {
+        final Preference preference = new Preference(
+                ShadowApplication.getInstance().getApplicationContext());
+        final Tile tile = new Tile();
+        tile.metaData = new Bundle();
+        tile.priority = 10;
+        tile.intent = new Intent();
+        mImpl.bindPreferenceToTile(mActivity, preference, tile, "123");
+
+        assertThat(preference.getFragment()).isNull();
+        assertThat(preference.getOnPreferenceClickListener()).isNotNull();
+        assertThat(preference.getOrder()).isEqualTo(-tile.priority);
+    }
+
+    @Test
+    public void bindPreference_withNullKeyNullPriority_shouldGenerateKeyAndPriority() {
+        final Preference preference = new Preference(
+                ShadowApplication.getInstance().getApplicationContext());
+        final Tile tile = new Tile();
+        tile.intent = new Intent();
+        tile.intent.setComponent(new ComponentName("pkg", "class"));
+        mImpl.bindPreferenceToTile(mActivity, preference, tile, null /* key */);
+
+        assertThat(preference.getKey()).isNotNull();
+        assertThat(preference.getOrder()).isEqualTo(Preference.DEFAULT_ORDER);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index 432be56..ce4dd68 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -16,10 +16,14 @@
 package com.android.settings.dashboard;
 
 import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Icon;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
-
+import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.overlay.FeatureFactory;
@@ -27,29 +31,27 @@
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DashboardFragmentTest {
 
@@ -59,6 +61,8 @@
     private DashboardCategory mDashboardCategory;
     @Mock
     private FakeFeatureFactory mFakeFeatureFactory;
+    @Mock
+    private ProgressiveDisclosureMixin mDisclosureMixin;
     private TestFragment mTestFragment;
 
     @Before
@@ -69,9 +73,12 @@
         mDashboardCategory.tiles = new ArrayList<>();
         mDashboardCategory.tiles.add(new Tile());
         mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext());
-        mTestFragment.onAttach(mContext);
+        when(mFakeFeatureFactory.dashboardFeatureProvider
+                .getProgressiveDisclosureMixin(any(Context.class), eq(mTestFragment)))
+                .thenReturn(mDisclosureMixin);
         when(mFakeFeatureFactory.dashboardFeatureProvider.getTilesForCategory(anyString()))
                 .thenReturn(mDashboardCategory);
+        mTestFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
     }
 
     @Test
@@ -87,11 +94,14 @@
 
     @Test
     public void displayTilesAsPreference_shouldAddTilesWithIntent() {
+        when(mFakeFeatureFactory.dashboardFeatureProvider.getTilesForCategory(anyString()))
+                .thenReturn(mDashboardCategory);
         when(mFakeFeatureFactory.dashboardFeatureProvider.getDashboardKeyForTile(any(Tile.class)))
                 .thenReturn("test_key");
         mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
 
-        verify(mTestFragment.mScreen).addPreference(any(DashboardTilePreference.class));
+        verify(mDisclosureMixin).addPreference(any(PreferenceScreen.class),
+                any(DashboardTilePreference.class));
     }
 
     @Test
@@ -109,6 +119,21 @@
         verify(mTestFragment.mScreen, never()).addPreference(any(DashboardTilePreference.class));
     }
 
+    @Test
+    public void updateState_skipUnavailablePrefs() {
+        List<PreferenceController> preferenceControllers = mTestFragment.mControllers;
+        preferenceControllers.add(mock(PreferenceController.class));
+        preferenceControllers.add(mock(PreferenceController.class));
+        when(preferenceControllers.get(0).isAvailable()).thenReturn(false);
+        when(preferenceControllers.get(1).isAvailable()).thenReturn(true);
+
+        mTestFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
+        mTestFragment.onResume();
+
+        verify(mTestFragment.mControllers.get(0), never()).getPreferenceKey();
+        verify(mTestFragment.mControllers.get(1)).getPreferenceKey();
+    }
+
     public static class TestPreferenceController extends PreferenceController {
 
         public TestPreferenceController(Context context) {
@@ -121,12 +146,12 @@
         }
 
         @Override
-        protected boolean isAvailable() {
+        public boolean isAvailable() {
             return false;
         }
 
         @Override
-        protected String getPreferenceKey() {
+        public String getPreferenceKey() {
             return null;
         }
 
@@ -139,12 +164,13 @@
     public static class TestFragment extends DashboardFragment {
 
         private final Context mContext;
-        @Mock
         public PreferenceScreen mScreen;
+        private List<PreferenceController> mControllers;
 
         public TestFragment(Context context) {
             mContext = context;
             mScreen = mock(PreferenceScreen.class);
+            mControllers = new ArrayList<>();
         }
 
         @Override
@@ -179,7 +205,7 @@
 
         @Override
         protected List<PreferenceController> getPreferenceControllers(Context context) {
-            return null;
+            return mControllers;
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java
new file mode 100644
index 0000000..ab94f35
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.content.Context;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.testutils.FakeFeatureFactory;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ProgressiveDisclosureTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock
+    private FakeFeatureFactory mFakeFeatureFactory;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceFragment mPreferenceFragment;
+    private PreferenceScreen mScreen;
+    private Context mAppContext;
+    private Preference mPreference;
+
+    private ProgressiveDisclosureMixin mMixin;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        FakeFeatureFactory.setupForTest(mContext);
+        mScreen = mPreferenceFragment.getPreferenceScreen();
+        mAppContext = ShadowApplication.getInstance().getApplicationContext();
+        mFakeFeatureFactory = (FakeFeatureFactory) FeatureFactory.getFactory(mContext);
+        mMixin = new ProgressiveDisclosureMixin(mAppContext,
+                mFakeFeatureFactory.dashboardFeatureProvider, mPreferenceFragment);
+        mPreference = new Preference(mAppContext);
+        mPreference.setKey("test");
+        when(mFakeFeatureFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
+    }
+
+    @Test
+    public void shouldNotCollapse_lessPreferenceThanLimit() {
+        when(mScreen.getPreferenceCount()).thenReturn(5);
+
+        mMixin.setTileLimit(10);
+
+        assertThat(mMixin.shouldCollapse(mScreen)).isFalse();
+    }
+
+    @Test
+    public void shouldCollapse_morePreferenceThanLimit() {
+        when(mFakeFeatureFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
+        when(mScreen.getPreferenceCount()).thenReturn(5);
+
+        assertThat(mMixin.shouldCollapse(mScreen)).isTrue();
+    }
+
+    @Test
+    public void findPreference_prefInCollapsedList_shouldFindIt() {
+        when(mScreen.findPreference(anyString())).thenReturn(null);
+        mMixin.addToCollapsedList(mPreference);
+
+        Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
+
+        assertThat(pref).isNotNull();
+        assertThat(pref).isSameAs(mPreference);
+    }
+
+    @Test
+    public void findPreference_prefOnScreen_shouldFindIt() {
+        when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
+
+        Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
+
+        assertThat(pref).isNotNull();
+        assertThat(pref).isSameAs(mPreference);
+    }
+
+    @Test
+    public void findPreference_prefNotInCollapsedListOrScreen_shouldNotFindIt() {
+        when(mScreen.findPreference(anyString())).thenReturn(null);
+        Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
+
+        assertThat(pref).isNull();
+    }
+
+    @Test
+    public void findPreference_prefRemovedFromCollapsedList_shouldNotFindIt() {
+        when(mScreen.findPreference(anyString())).thenReturn(null);
+        mMixin.addToCollapsedList(mPreference);
+        mMixin.removePreference(mPreferenceFragment.getPreferenceScreen(), mPreference.getKey());
+
+        Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
+
+        assertThat(pref).isNull();
+    }
+
+    @Test
+    public void removePreference_shouldRemoveOnScreenPreference() {
+        when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
+
+        mMixin.removePreference(mScreen, mPreference.getKey());
+
+        verify(mScreen).removePreference(mPreference);
+    }
+
+    @Test
+    public void removeLastPreference_shouldRemoveExpandButtonToo() {
+        when(mScreen.findPreference(anyString())).thenReturn(null);
+        mMixin.addToCollapsedList(mPreference);
+        // Collapsed
+        assertThat(mMixin.isCollapsed()).isTrue();
+
+        mMixin.removePreference(mScreen, mPreference.getKey());
+
+        // Removing expand button
+        verify(mScreen).removePreference(any(Preference.class));
+        // No longer collapsed
+        assertThat(mMixin.isCollapsed()).isFalse();
+    }
+
+    @Test
+    public void collapse_shouldDoNothingIfNotCollapsible() {
+        final PreferenceScreen screen = mPreferenceFragment.getPreferenceScreen();
+        when(screen.getPreferenceCount()).thenReturn(5);
+        mMixin.setTileLimit(15);
+
+        mMixin.collapse(screen);
+        assertThat(mMixin.isCollapsed()).isFalse();
+        verify(screen, never()).addPreference(any(Preference.class));
+        verify(screen, never()).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void collapse_shouldRemovePrefAndAddExpandButton() {
+        final PreferenceScreen screen = mPreferenceFragment.getPreferenceScreen();
+        when(screen.getPreferenceCount()).thenReturn(5);
+        when(screen.getPreference(anyInt())).thenReturn(mPreference);
+        mMixin.setTileLimit(2);
+
+        mMixin.collapse(screen);
+
+        assertThat(mMixin.isCollapsed()).isTrue();
+        verify(screen).addPreference(any(ExpandPreference.class));
+        verify(screen, times(3)).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void addToCollapsedList_shouldAddInOrder() {
+        final Preference pref1 = new Preference(mAppContext);
+        final Preference pref2 = new Preference(mAppContext);
+        pref1.setOrder(10);
+        pref2.setOrder(20);
+
+        // Pref1 has lower order than pref2, but add pref2 first. The collapsed list should maintain
+        // items in increasing order.
+        mMixin.addToCollapsedList(pref2);
+        mMixin.addToCollapsedList(pref1);
+
+        List<Preference> collapsedList = mMixin.getCollapsedPrefs();
+        assertThat(collapsedList.get(0)).isSameAs(pref1);
+        assertThat(collapsedList.get(1)).isSameAs(pref2);
+    }
+
+    @Test
+    public void addPreferenceWhenCollapsed_noPrefOnScreen_shouldAddToList() {
+        // Add something to collapsed list so we are in collapsed state.
+        mMixin.addToCollapsedList(new Preference(mAppContext));
+        assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(1);
+
+        // Just 1 preference on screen: the more button
+        when(mScreen.getPreferenceCount()).thenReturn(1);
+        final Preference toBeAdded = new Preference(mAppContext);
+        toBeAdded.setOrder(100);
+        mMixin.addPreference(mScreen, toBeAdded);
+
+        // Should have 2 prefs in collapsed list now
+        assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(2);
+        assertThat(mMixin.getCollapsedPrefs().get(0)).isSameAs(toBeAdded);
+    }
+
+    @Test
+    public void addPreferenceWhenCollapsed_prefOrderLessThanLastOnScreen_shouldAddToScreen() {
+        final Preference lastPref = new Preference(mAppContext);
+        lastPref.setOrder(100);
+        // Add something to collapsed list so we are in collapsed state.
+        mMixin.addToCollapsedList(new Preference(mAppContext));
+        assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(1);
+        // 3 prefs on screen, 2 are real and the last one is more button.
+        when(mScreen.getPreferenceCount()).thenReturn(3);
+        when(mScreen.getPreference(1)).thenReturn(lastPref);
+
+        final Preference toBeAdded = new Preference(mAppContext);
+        toBeAdded.setOrder(50);
+        mMixin.addPreference(mScreen, toBeAdded);
+
+        verify(mScreen).removePreference(lastPref);
+        verify(mScreen).addPreference(toBeAdded);
+        assertThat(mMixin.getCollapsedPrefs().get(0)).isSameAs(lastPref);
+    }
+
+    @Test
+    public void addPreferenceWhenCollapsed_prefOrderMoreThanLastOnScreen_shouldAddToList() {
+        final Preference lastPref = new Preference(mAppContext);
+        lastPref.setOrder(100);
+        // Add something to collapsed list so we are in collapsed state.
+        mMixin.addToCollapsedList(new Preference(mAppContext));
+        assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(1);
+        // 3 prefs on screen, 2 are real and the last one is more button.
+        when(mScreen.getPreferenceCount()).thenReturn(3);
+        when(mScreen.getPreference(1)).thenReturn(lastPref);
+
+        final Preference toBeAdded = new Preference(mAppContext);
+        toBeAdded.setOrder(200);
+        mMixin.addPreference(mScreen, toBeAdded);
+
+        verify(mScreen, never()).removePreference(any(Preference.class));
+        verify(mScreen, never()).addPreference(any(Preference.class));
+        assertThat(mMixin.getCollapsedPrefs().get(0)).isSameAs(toBeAdded);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java
index 5c0c02a..f8797aa 100644
--- a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java
@@ -17,17 +17,15 @@
 
 import android.content.Context;
 import android.graphics.drawable.Icon;
-
 import com.android.internal.logging.MetricsProto;
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -35,7 +33,7 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ConditionTest {
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/DashboardTilePreferenceTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/DashboardTilePreferenceTest.java
index 470eb43..b726419 100644
--- a/tests/robotests/src/com/android/settings/dashboard/conditional/DashboardTilePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/DashboardTilePreferenceTest.java
@@ -21,20 +21,18 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.LinearLayout;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.DashboardTilePreference;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DashboardTilePreferenceTest {
 
diff --git a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
index 9ebb580..eec4324 100644
--- a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
@@ -20,15 +20,13 @@
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceManager;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
@@ -39,7 +37,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class BillingCycleSettingsTest {
 
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
index 368d0a1..003f4d3 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
@@ -2,17 +2,17 @@
 
 import android.net.NetworkPolicy;
 import android.net.NetworkTemplate;
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settingslib.net.DataUsageController.DataUsageInfo;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DataUsageInfoControllerTest {
     private DataUsageInfoController mInfoController;
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index e9f4446..e8a2ee4 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -18,13 +18,13 @@
 
 import android.content.Context;
 import android.net.ConnectivityManager;
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
@@ -32,7 +32,7 @@
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DataUsageSummaryTest {
     @Mock private ConnectivityManager mManager;
diff --git a/tests/robotests/src/com/android/settings/datausage/UnrestrictedDataAccessTest.java b/tests/robotests/src/com/android/settings/datausage/UnrestrictedDataAccessTest.java
index a04861d..c7b8dee 100644
--- a/tests/robotests/src/com/android/settings/datausage/UnrestrictedDataAccessTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/UnrestrictedDataAccessTest.java
@@ -17,21 +17,19 @@
 
 import android.content.pm.ApplicationInfo;
 import android.os.Process;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settingslib.applications.ApplicationsState;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class UnrestrictedDataAccessTest {
 
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
new file mode 100644
index 0000000..e3a4ba3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2016 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.deviceinfo;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.os.Build;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.DevelopmentSettings;
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Answers.RETURNS_DEEP_STUBS;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BuildNumberPreferenceControllerTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Activity mActivity;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Fragment mFragment;
+    @Mock(answer = RETURNS_DEEP_STUBS)
+    private PreferenceScreen mScreen;
+    @Mock
+    private UserManager mUserManager;
+
+    private Preference mPreference;
+    private BuildNumberPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        mController = new BuildNumberPreferenceController(mContext, mActivity, mFragment);
+
+        mPreference = new Preference(ShadowApplication.getInstance().getApplicationContext());
+        mPreference.setKey(mController.getPreferenceKey());
+    }
+
+    @Test
+    public void displayPref_shouldAlwaysDisplay() {
+        mController.displayPreference(mScreen);
+
+        verify(mScreen.findPreference(mController.getPreferenceKey())).setSummary(Build.DISPLAY);
+        verify(mScreen, never()).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void handlePrefTreeClick_onlyHandleBuildNumberPref() {
+        assertThat(mController.handlePreferenceTreeClick(mock(Preference.class))).isFalse();
+    }
+
+    @Test
+    public void handlePrefTreeClick_notAdminUser_doNothing() {
+        when(mUserManager.isAdminUser()).thenReturn(false);
+
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
+    }
+
+    @Test
+    public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        Settings.Global.putInt(context.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0);
+
+        mController = new BuildNumberPreferenceController(context, mActivity, mFragment);
+
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
+    }
+
+    @Test
+    public void handlePrefTreeClick_userHasRestrction_doNothing() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        Settings.Global.putInt(context.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        when(mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES))
+                .thenReturn(true);
+
+        mController = new BuildNumberPreferenceController(context, mActivity, mFragment);
+
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
+    }
+
+    @Test
+    public void onActivityResult_notConfirmPasswordRequest_doNothing() {
+        final boolean activityResultHandled = mController.onActivityResult(
+                BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF + 1,
+                Activity.RESULT_OK,
+                null);
+
+        assertThat(activityResultHandled).isFalse();
+        verify(mContext, never())
+                .getSharedPreferences(DevelopmentSettings.PREF_FILE, Context.MODE_PRIVATE);
+    }
+
+    @Test
+    public void onActivityResult_confirmPasswordRequestFailed_doNotEnableDevPref() {
+        final boolean activityResultHandled = mController.onActivityResult(
+                BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
+                Activity.RESULT_CANCELED,
+                null);
+
+        assertThat(activityResultHandled).isTrue();
+        verify(mContext, never())
+                .getSharedPreferences(DevelopmentSettings.PREF_FILE, Context.MODE_PRIVATE);
+    }
+
+    @Test
+    public void onActivityResult_confirmPasswordRequestCompleted_enableDevPref() {
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+
+        mController = new BuildNumberPreferenceController(context, mActivity, mFragment);
+
+        final boolean activityResultHandled = mController.onActivityResult(
+                BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
+                Activity.RESULT_OK,
+                null);
+
+        assertThat(activityResultHandled).isTrue();
+        assertThat(context.getSharedPreferences(DevelopmentSettings.PREF_FILE,
+                Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW, false))
+                .isTrue();
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/ManageStoragePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/ManageStoragePreferenceControllerTest.java
index d2c169e..12b3218 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/ManageStoragePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/ManageStoragePreferenceControllerTest.java
@@ -19,21 +19,18 @@
 import android.content.Context;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Answers.RETURNS_DEEP_STUBS;
 import static org.mockito.Matchers.any;
@@ -41,7 +38,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ManageStoragePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
index 70cf454..9ca218c 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
@@ -19,28 +19,25 @@
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
-
 import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Answers.RETURNS_DEEP_STUBS;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SystemUpdatePreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
new file mode 100644
index 0000000..632d549
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2016 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.fuelgauge;
+
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Handler;
+import android.os.UserManager;
+
+import com.android.internal.os.BatterySipper;
+import com.android.internal.os.BatterySipper.DrainType;
+import com.android.settings.TestConfig;
+
+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.MockitoRule;
+import org.mockito.junit.MockitoJUnit;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BatteryEntryTest {
+
+    private static final int APP_UID = 123;
+    private static final String APP_DEFAULT_PACKAGE_NAME = "com.android.test";
+    private static final String APP_LABEL = "Test App Name";
+    private static final String HIGH_DRAIN_PACKAGE = "com.android.test.screen";
+
+    @Rule public MockitoRule mocks = MockitoJUnit.rule();
+
+    @Mock private Context mockContext;
+    @Mock private Handler mockHandler;
+    @Mock private PackageManager mockPackageManager;
+    @Mock private UserManager mockUserManager;
+
+    @Before
+    public void stubContextToReturnMockPackageManager() {
+        when(mockContext.getPackageManager()).thenReturn(mockPackageManager);
+    }
+
+    @Before
+    public void stubPackageManagerToReturnAppPackageAndName() throws NameNotFoundException {
+        when(mockPackageManager.getPackagesForUid(APP_UID)).thenReturn(
+            new String[]{APP_DEFAULT_PACKAGE_NAME});
+
+        ApplicationInfo appInfo = mock(ApplicationInfo.class);
+        when(mockPackageManager.getApplicationInfo(APP_DEFAULT_PACKAGE_NAME, 0 /* no flags */))
+            .thenReturn(appInfo);
+        when(mockPackageManager.getApplicationLabel(appInfo)).thenReturn(APP_LABEL);
+    }
+
+    private BatteryEntry createBatteryEntryForApp() {
+        return new BatteryEntry(mockContext, mockHandler, mockUserManager, createSipperForApp());
+    }
+
+    private BatterySipper createSipperForApp() {
+        BatterySipper sipper =
+            new BatterySipper(DrainType.APP, new FakeUid(APP_UID), 0 /* power use */);
+        sipper.packageWithHighestDrain = HIGH_DRAIN_PACKAGE;
+        return sipper;
+    }
+
+    @Test
+    public void batteryEntryForApp_shouldSetDefaultPackageNameAndLabel() throws Exception {
+        BatteryEntry entry = createBatteryEntryForApp();
+
+        assertThat(entry.defaultPackageName).isEqualTo(APP_DEFAULT_PACKAGE_NAME);
+        assertThat(entry.getLabel()).isEqualTo(APP_LABEL);
+    }
+
+    @Test
+    public void batteryEntryForApp_shouldSetLabelAsPackageName_whenPackageCannotBeFound()
+        throws Exception {
+      when(mockPackageManager.getApplicationInfo(APP_DEFAULT_PACKAGE_NAME, 0 /* no flags */))
+          .thenThrow(new NameNotFoundException());
+
+      BatteryEntry entry = createBatteryEntryForApp();
+
+      assertThat(entry.getLabel()).isEqualTo(APP_DEFAULT_PACKAGE_NAME);
+    }
+
+    @Test
+    public void batteryEntryForApp_shouldSetHighestDrainPackage_whenPackagesCannotBeFoundForUid() {
+        when(mockPackageManager.getPackagesForUid(APP_UID)).thenReturn(null);
+
+        BatteryEntry entry = createBatteryEntryForApp();
+
+        assertThat(entry.getLabel()).isEqualTo(HIGH_DRAIN_PACKAGE);
+    }
+
+    @Test
+    public void batteryEntryForApp_shouldSetHighestDrainPackage_whenMultiplePackagesFoundForUid() {
+        when(mockPackageManager.getPackagesForUid(APP_UID)).thenReturn(
+            new String[]{APP_DEFAULT_PACKAGE_NAME, "package2", "package3"});
+
+        BatteryEntry entry = createBatteryEntryForApp();
+        
+        assertThat(entry.getLabel()).isEqualTo(HIGH_DRAIN_PACKAGE);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
new file mode 100644
index 0000000..e2b4473
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016 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.gestures;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SwipeToNotificationPreferenceControllerTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceScreen mScreen;
+
+    private SwipeToNotificationPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new SwipeToNotificationPreferenceController(mContext);
+    }
+
+    @Test
+    public void display_configIsTrue_shouldDisplay() {
+        when(mContext.getResources().
+                getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+                .thenReturn(true);
+        mController.displayPreference(mScreen);
+
+        verify(mScreen, never()).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void display_configIsFalse_shouldNotDisplay() {
+        when(mContext.getResources().
+                getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+                .thenReturn(false);
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mock(Preference.class));
+
+        mController.displayPreference(mScreen);
+
+        verify(mScreen).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void updateState_preferenceSetCheckedWhenSettingIsOn() {
+        final TwoStatePreference preference = mock(TwoStatePreference.class);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        Settings.System.putInt(context.getContentResolver(), SYSTEM_NAVIGATION_KEYS_ENABLED, 1);
+
+        mController = new SwipeToNotificationPreferenceController(context);
+        mController.updateState(preference);
+
+        verify(preference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_preferenceSetUncheckedWhenSettingIsOff() {
+        final TwoStatePreference preference = mock(TwoStatePreference.class);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        Settings.System.putInt(context.getContentResolver(), SYSTEM_NAVIGATION_KEYS_ENABLED, 0);
+
+        mController = new SwipeToNotificationPreferenceController(context);
+        mController.updateState(preference);
+
+        verify(preference).setChecked(false);
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
index 0adfea8..d3d6836 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
@@ -19,16 +19,14 @@
 import android.net.ConnectivityManager;
 import android.os.UserHandle;
 import android.os.UserManager;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -36,7 +34,7 @@
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.when;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class MobileNetworkPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
index 386fbc6..6dd9c75 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
@@ -16,23 +16,21 @@
 package com.android.settings.network;
 
 import android.content.Context;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.drawer.CategoryKey;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class NetworkDashboardFragmentTest {
 
diff --git a/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java
new file mode 100644
index 0000000..4eb33e9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2016 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.notification;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static android.provider.Settings.System.NOTIFICATION_LIGHT_PULSE;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class PulseNotificationPreferenceControllerTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceScreen mScreen;
+
+    private PulseNotificationPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new PulseNotificationPreferenceController(mContext);
+    }
+
+    @Test
+    public void display_configIsTrue_shouldDisplay() {
+        when(mContext.getResources().
+                getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed))
+                .thenReturn(true);
+        mController.displayPreference(mScreen);
+
+        verify(mScreen, never()).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void display_configIsFalse_shouldNotDisplay() {
+        when(mContext.getResources().
+                getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed))
+                .thenReturn(false);
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mock(Preference.class));
+
+        mController.displayPreference(mScreen);
+
+        verify(mScreen).removePreference(any(Preference.class));
+    }
+
+    @Test
+    public void updateState_preferenceSetCheckedWhenSettingIsOn() {
+        final TwoStatePreference preference = mock(TwoStatePreference.class);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        Settings.System.putInt(context.getContentResolver(), NOTIFICATION_LIGHT_PULSE, 1);
+
+        mController = new PulseNotificationPreferenceController(context);
+        mController.updateState(preference);
+
+        verify(preference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_preferenceSetUncheckedWhenSettingIsOff() {
+        final TwoStatePreference preference = mock(TwoStatePreference.class);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        Settings.System.putInt(context.getContentResolver(), NOTIFICATION_LIGHT_PULSE, 0);
+
+        mController = new PulseNotificationPreferenceController(context);
+        mController.updateState(preference);
+
+        verify(preference).setChecked(false);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java
index 61dbe08..2921b30 100644
--- a/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java
@@ -16,6 +16,22 @@
 
 package com.android.settings.password;
 
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
 import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
 import static com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS;
 import static com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY;
@@ -29,28 +45,10 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.Bundle;
-
-import com.android.settings.TestConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
 /**
  * Tests for {@link SetNewPasswordController}.
  */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public final class SetNewPasswordControllerTest {
     private static final int CURRENT_UID = 101;
diff --git a/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
index eb8b43b..65a8805 100644
--- a/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
@@ -18,20 +18,17 @@
 
 
 import android.app.Activity;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.FakeFeatureFactory;
-
 import com.google.common.truth.Truth;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
 import static com.android.settings.system.SystemDashboardFragment.SUMMARY_PROVIDER_FACTORY;
@@ -40,7 +37,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SystemDashboardFragmentTest {
 
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index d872f7c..7bf908d 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -16,7 +16,6 @@
 package com.android.settings.testutils;
 
 import android.content.Context;
-
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowTextUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowTextUtils.java
index c6ed2fa..03991e6 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowTextUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowTextUtils.java
@@ -21,11 +21,10 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.view.View;
+import java.util.Locale;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
-import java.util.Locale;
-
 /**
  * Important: The current robolectric doesn't support API 24, so I copy the code
  * from API 24 here to make it compatible. Once robolectric is upgraded to 24,
diff --git a/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java b/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java
index 6a804d0..4267ed1 100644
--- a/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java
@@ -17,14 +17,13 @@
 
 
 import com.android.settings.TestConfig;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
-import static org.junit.Assert.fail;
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
 
 @RunWith(RobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
diff --git a/tests/robotests/src/com/android/settings/widget/RingProgressBarTest.java b/tests/robotests/src/com/android/settings/widget/RingProgressBarTest.java
new file mode 100644
index 0000000..b7a5fd9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/RingProgressBarTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016 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 static junit.framework.Assert.assertEquals;
+
+import android.content.Context;
+import android.view.View.MeasureSpec;
+
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class RingProgressBarTest {
+
+    private Context mContext = RuntimeEnvironment.application;
+
+    private RingProgressBar mProgressBar;
+
+    @Before
+    public void setUp() {
+        mProgressBar = new RingProgressBar(mContext);
+    }
+
+    @Test
+    public void testMeasurePortrait() {
+        mProgressBar.measure(
+                MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY));
+        assertEquals(100, mProgressBar.getMeasuredHeight());
+        assertEquals(100, mProgressBar.getMeasuredWidth());
+    }
+
+    @Test
+    public void testMeasureLandscape() {
+        mProgressBar.measure(
+                MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY));
+        assertEquals(100, mProgressBar.getMeasuredHeight());
+        assertEquals(100, mProgressBar.getMeasuredWidth());
+    }
+
+    @Test
+    public void testDefaultAttributes() {
+        assertEquals(false, mProgressBar.isIndeterminate());
+        assertEquals(0, mProgressBar.getProgress());
+        assertEquals(10000, mProgressBar.getMax());
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java b/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
index cce0f32..da7b092 100644
--- a/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
+++ b/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
@@ -21,22 +21,19 @@
 import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewGroup;
-
+import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.shadow.ShadowTextUtils;
-
+import java.util.Locale;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-import java.util.Locale;
-
 import static com.google.common.truth.Truth.assertThat;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class RtlCompatibleViewPagerTest {